Я изучаю Zend Framework на данный момент и натолкнулся на следующий синтаксис.
class Zend_Controller_Action_Helper_Redirector extends Zend_Controller_Action_Helper_Abstract { /** * Perform a redirect to an action/controller/module with params * * @param string $action * @param string $controller * @param string $module * @param array $params * @return void */ public function gotoSimple($action, $controller = null, $module = null, array $params = array()) { $this->setGotoSimple($action, $controller, $module, $params); if ($this->getExit()) { $this->redirectAndExit(); } } /** * direct(): Perform helper when called as * $this->_helper->redirector($action, $controller, $module, $params) * * @param string $action * @param string $controller * @param string $module * @param array $params * @return void */ public function direct($action, $controller = null, $module = null, array $params = array()) { $this->gotoSimple($action, $controller, $module, $params); } }
В Zend Framework метод direct () в этом классе можно вызвать, используя следующий синтаксис:
$this->_helper->redirector('index','index');
Если перенаправитель является объектом (!) В объекте _helper, который находится внутри объекта контроллера, в котором мы вызываем метод. Синтаксический сахар здесь заключается в том, что вы можете просто передать параметры объекту вместо метода, который мы будем писать так:
$this->_helper->redirector->gotoSimple('index','index');
.. все это прекрасно и денди.
Вот мой вопрос : это стандартный метод direct () в OO PHP? Или эта функциональность встроена в Zend Framework? Я не могу найти документацию по этому вопросу.
Благодаря!
Это функциональность, встроенная в Zend Framework.
Свойство $_helpers
в экземпляре Controller содержит экземпляр Action_HelperBroker
. Этот экземпляр реализует магический метод __call
PHP . Когда вы вызываете метод, который не существует в этом экземпляре, он попытается использовать имя метода для извлечения помощника с тем же именем и вызова direct()
на нем (если это возможно). См. Код ниже.
Из Zend_Controller_Action
/** * Helper Broker to assist in routing help requests to the proper object * * @var Zend_Controller_Action_HelperBroker */ protected $_helper = null;
Из Zend_Controller_Action_HelperBroker
/** * Method overloading * * @param string $method * @param array $args * @return mixed * @throws Zend_Controller_Action_Exception if helper does not have a direct() method */ public function __call($method, $args) { $helper = $this->getHelper($method); if (!method_exists($helper, 'direct')) { require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()'); } return call_user_func_array(array($helper, 'direct'), $args); }
Брокер Helper также реализует магический метод __get
, поэтому, когда вы пытаетесь получить доступ к свойству, которого не существует, брокер будет использовать имя свойства в качестве аргумента для getHelper()
/** * Retrieve helper by name as object property * * @param string $name * @return Zend_Controller_Action_Helper_Abstract */ public function __get($name) { return $this->getHelper($name); }
Помните, что магические методы не предназначены для замены надлежащего API. Хотя вы можете использовать их, как показано выше, вызывая более подробные
$this->_helper->getHelper('redirector')->gotoSimple('index','index');
часто является гораздо более быстрой альтернативой.