Как синтаксис метода «public function direct () {}» работает в PHP?

Я изучаю 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'); 

часто является гораздо более быстрой альтернативой.