php - 在PHP中,方法的语法"public function direct() {}"是如何工作的?

  显示原文与译文双语对照的内容

我现在正在学习 Zend 框架,并遇到了以下语法。


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 框架中,可以使用以下语法调用此类中的direct() 方法:


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



在( ) 对象中,重定向器是一个对象,在控制器对象中,我们调用方法。 这里的句法糖是你只能将参数传递给对象而不是方法,这样我们就会写出来:


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



which ofcourse这一切都很好。

这里有我的问题 这个 direct() 方法标准在 OO PHP中? 或者这个功能是内置到 Zend 框架中的? 我无法在这里找到任何文档。

谢谢!

时间: 原作者:

它是 Zend 框架中的功能。

控制器实例中的$_helpers 属性保存一个 Action_HelperBroker 实例。 这里实例实现了 php __call 方法的魔术。 当调用该实例上不存在的方法时,它将尝试使用方法名获取相同名称的helper 并调用 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 方法,因此当你试图访问不存在的属性时,代理将使用属性名作为参数,以进行处理。


/**


 * 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');



通常是更快速的选择。

原作者:
...