【问题标题】:Have $this in PHP implicit function before PHP 5.4.0在 PHP 5.4.0 之前的 PHP 隐式函数中有 $this
【发布时间】:2013-06-22 20:24:13
【问题描述】:

根据http://php.net/manual/en/functions.anonymous.php,在PHP 5.3 中,$this 不能从隐式函数内部访问,即使该函数是在存在$this 的上下文中定义的。有没有办法解决这个限制? (顺便说一下,无法在网络服务器上升级 PHP 安装)

我想使用隐式函数的方式是定义一个回调,它是某个对象的成员函数。更准确地说,我想做类似的事情

$callback = function() { return $this->my_callback(); }

实际上,事件更好的语法应该是

$callback = $this->my_callback

但我无法让它工作(当我尝试执行回调时,PHP 因“致命错误:函数名必须是字符串”而死掉)。

【问题讨论】:

  • 如果一切都是 PHP 中的一等对象

标签: php closures


【解决方案1】:

应该做的工作:

$object = $this ;
$callback = function() use ($object) { return $object->my_callback(); } ;

use 将在声明时将可访问变量(在我们的例子中是对象的引用)带到函数范围,因此您不必将其作为参数发送。

有时使用$self$that 这样的varname 会更好,这样更清楚。

【讨论】:

  • 对于我的情况来说,这绝对是最好的方法,尽管我觉得需要这样的技巧并且不能直接写use ($this),这让我很尴尬。谢谢。
  • 我在PHP 5.4 之前也遇到过这个问题,我知道那种感觉:)
  • 值得注意的是,这种方法与 5.4 的主要区别是:您不能使用它访问受保护/私有方法。从 5.4 开始,您确实 可以访问非公共功能,因为闭包绑定到创建它的类的范围。此外,5.3 即将结束生命周期,现在是only supported to the extent that it needs security fixes. 您需要升级。
【解决方案2】:
$function = array($this, 'my_callback');

(可能与call_user_func()结合使用)

【讨论】:

    【解决方案3】:

    看起来您可以将变量传递给回调函数。我没有在 PHP 中使用过闭包,但我认为这对你有用:

    $callback = function($instance) { return $instance->my_callback(); }
    $callback($this);
    

    或者如果回调是在当前类之外触发的。

    $callback($myClassInstance);
    

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 2021-06-16
      • 2014-09-15
      • 1970-01-01
      • 2016-03-27
      • 2016-07-20
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多