ZF2中ViewModel和Closure的奇怪行为

时间:2016-01-14 00:48:33

标签: php callback zend-framework2

我尝试将回调函数传递给模板,该模板应该在模板中调用,但是在参数传递给方法setVariable()后直接调用回调

public function testAction() {
   $model = new ViewModel();
   $callback = function() {
      return new \stdClass();
   };
   $model->setVariable('call', $callback);

   \Zend\Debug\Debug::dump([
       get_class($callback), 
       get_class($model->getVariable('call'))
   ]);
}

结果有点奇怪:

array(2) {
 [0] => string(7) "Closure"
 [1] => string(8) "stdClass"
}

我不明白为什么会这样。是这个错误或功能吗?

1 个答案:

答案 0 :(得分:2)

视图变量存储为自定义ArrayObjectZend\View\Variables

调试中的$viewModel->getVariable()来电将代理offsetGet方法和will cause the closure to be invoked

相关代码。

public function offsetGet($key)
{
    // ...
    $return = parent::offsetGet($key);
    // If we have a closure/functor, invoke it, and return its return value
    if (is_object($return) && is_callable($return)) {
        $return = call_user_func($return);
    }
    return $return;
}

如果您想要闭包对象,那么您可能需要考虑使用视图助手。