У меня проблемы с пониманием этого действительно простого кода PHP. Пожалуйста помоги? - PullRequest
0 голосов
/ 26 февраля 2010

Вот код:

<?php

 class Order extends Zend_Db_Table_Abstract
 {
 protected $_name = 'orders';

 protected $_limit = 200;

 protected $_authorised = false;

 public function setLimit($limit)
 {
 $this->_limit = $limit;
 }

 public function setAuthorised($auth)
 {
 $this->_authorised = (bool) $auth;
 }

 public function insert(array $data)
 {
 if ($data['amount'] > $this->_limit
 && $this->_authorised === false) {
 throw new Exception('Unauthorised transaction of greater than '
 . $this->_limit . ' units');
 }
 return parent::insert($data);
 }
 }

Что делает parent::insert($data) в методе insert ()? Это зовет себя? Зачем это делать? Почему выполняется оператор return независимо от условного IF?

Ответы [ 4 ]

2 голосов
/ 26 февраля 2010

Это вызывает метод вставки в классе Zend_Db_Table_Abstract. Оператор возврата будет выполняться только в случае сбоя условного выражения.

throw new Exception сгенерирует исключение и вернет выполнение к месту, которое вызвало метод.

0 голосов
/ 26 февраля 2010

parent:: аналогично ключевому слову self:: или YourClassNameHere:: в том смысле, что оно используется для вызова статической функции, за исключением того, что parent вызовет функцию, определенную в классе, который расширяет текущий класс.

Кроме того, оператор throw является точкой выхода из функции, поэтому, если выполнение выполняется, функция никогда не попадет в оператор return. Если выброшено исключение, то вызывающая функция должна либо перехватить и обработать исключение, используя try и catch, либо позволить исключению распространяться далее вверх по стеку вызовов.

0 голосов
/ 26 февраля 2010
<?php

 class Order extends Zend_Db_Table_Abstract
 {
 protected $_name = 'orders';

 protected $_limit = 200;

 protected $_authorised = false;

 public function setLimit($limit)
 {
 $this->_limit = $limit;
 }

 public function setAuthorised($auth)
 {
 $this->_authorised = (bool) $auth;
 }

 public function insert(array $data)
 {
 if ($data['amount'] > $this->_limit
 && $this->_authorised === false) {
 throw new Exception('Unauthorised transaction of greater than '
 . $this->_limit . ' units');
 }
 return $this->insert($data);
 }
 }

Позвоните этому классу

$order = new Order();
$order->insert($data);
0 голосов
/ 26 февраля 2010

parent::insert($data) вызывает родительскую реализацию функции insert (), т.е. Zend_Db_Table_Abstract

Таким образом, можно добавить пользовательскую проверку в новый класс и по-прежнему использовать код в реализации родительского класса (вместо необходимости копировать + вставлять его в функцию).

...