Как синтаксис метода 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');

Где redirector — это объект(!) в объекте _helper, который находится внутри объекта контроллера, в котором мы вызываем метод. Синтаксический сахар здесь в том, что вы можете просто передавать параметры объекту, а не методу, который мы бы написали так:

$this->_helper->redirector->gotoSimple('index','index');

..что все прекрасно и денди, конечно.

Вот мой вопрос: является ли этот метод direct() стандартным в объектно-ориентированном PHP? Или эта функциональность встроена в Zend Framework? Я не могу найти никакой документации по этому поводу.

Спасибо!


person Niels Bom    schedule 30.10.2010    source источник


Ответы (1)


Это функциональность, встроенная в Zend Framework.

Свойство $_helpers в экземпляре контроллера содержит экземпляр 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);
}

Помощник-брокер также реализует магический метод __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');

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

person Gordon    schedule 30.10.2010
comment
Кроме того, вы можете прочитать о помощниках (и методе direct) здесь: devzone.zend.com/article/3350 - person Ernest; 30.10.2010
comment
После вашего редактирования: вы говорите, что более длинный синтаксис является более быстрой альтернативой, мы говорим намного быстрее или это довольно незначительно? ОК, это зависит, конечно, но похоже ли это на сравнение синтаксического анализа строки в двойных кавычках с переменными или конкатенации строк и переменных в одинарных кавычках? - person Niels Bom; 30.10.2010