Php Zend框架:按引用传递到视图帮助程序不工作
下面是一个简单的视图帮助器(请注意passbyreference参数):Php Zend框架:按引用传递到视图帮助程序不工作,php,zend-framework,pass-by-reference,view-helpers,Php,Zend Framework,Pass By Reference,View Helpers,下面是一个简单的视图帮助器(请注意passbyreference参数): 这在视图中不起作用$array['someExistingKey']仍处于设置状态(在方法的直接上下文中除外)。Zend必须采取措施防止数组通过引用传入。有什么解决方案吗?当您从模板中调用$this->MyViewHelper($array)时,实际上并不是直接调用helper类,Zend_View正在实例化该类并为您调用它。所以我想你可能很难让它工作。您最好的选择可能是使用Zend_注册表或重构,以采用不需要全局的不同方
这在视图中不起作用<代码>$array['someExistingKey']仍处于设置状态(在方法的直接上下文中除外)。Zend必须采取措施防止数组通过引用传入。有什么解决方案吗?当您从模板中调用
$this->MyViewHelper($array)
时,实际上并不是直接调用helper类,Zend_View正在实例化该类并为您调用它。所以我想你可能很难让它工作。您最好的选择可能是使用Zend_注册表或重构,以采用不需要全局的不同方法。我刚刚想到了一个解决方法。您只需手动调用帮助程序,而不是让ZF通过call\u user\u func\u array
调用它
Ref.php
class Zend_View_Helper_Ref extends Zend_View_Helper_Abstract
{
public function removeFromRef(&$ref)
{
// change your var value here
unset($ref['key']);
}
/**
* ZF calls this for us, but we'll call what we want, so you can skip this.
*/
// public function ref()
// {}
}
如您所见,您可以跳过必须将主方法命名为文件名的约定,但我仍然建议您这样做。
现在,您可以在视图/控制器中传递引用:
// in view:
$this->getHelper('Ref')->removeFromRef($someVar2Change);
// in controller
$this->view->getHelper('Ref')->removeFromRef($someVar2Change);
基本上,这就是$this->ref()
所做的:获取帮助程序,然后调用call\u user\u func\u数组
虽然有些人在使用$this->getHelper('Ref')->Ref()
而不是$this->Ref()
时可能会遇到问题,但它是有效的。这很令人失望,但可以理解。(顺便说一句,这并不是一个真正的“全球”,但我知道你的意思。)参见Zend_View_Abstract::_call()。它使用call\u user\u func\u数组
来调用助手类。看见
// in view:
$this->getHelper('Ref')->removeFromRef($someVar2Change);
// in controller
$this->view->getHelper('Ref')->removeFromRef($someVar2Change);