Underscore.php抛出非静态方法__ :: invoke()不应该静态调用

时间:2013-11-24 22:32:16

标签: php underscore.php

我刚刚升级到PHP 5.5.3并且我注意到Underscore.php引发了一个奇怪的错误:

Non-static method __::invoke() should not be called statically

导致此错误的相关代码如下所示:

$params = \__::invoke( $params, function( $value ) {
   ...
} );

通过Underscore.php源代码,我不明白为什么抛出此错误,因为invoke的调用应由__callStatic处理程序处理:

public static function __callStatic($name, $arguments) {
  $mixins =& self::getInstance()->_mixins;
  return call_user_func_array($mixins[$name], $arguments);
}

我不想搞砸PHP中的错误报告设置,因为这意味着在整个堆栈中改变PHP设置。

我目前的解决方法是:

$__ = new \__();

$params = $__->invoke( $params, function( $value ) {
  ...
} );

至少可以说是笨拙的。还有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

我相信您收到了E_STRICT错误,看起来这已成为一个问题很长一段时间了:

https://github.com/brianhaveri/Underscore.php/issues/4

Underscore.php几年内没有更新,所以我不会屏住呼吸,他们很快就会解决这个问题。

自PHP 5.4起,

E_STRICT仅成为E_ALL的一部分。这可以解释为什么自升级以来它一直出现。

更新:看一下Underscore.php的这个分支,它修复了这些PHP 5.4+错误:

https://github.com/JonathanAquino/Underscore.php

答案 1 :(得分:0)

  

通过Underscore.php源代码,我不明白为什么抛出这个错误,因为调用调用应由__callStatic处理程序处理:

这是对PHP如何运作的误解。仅当函数不可访问(私有或不存在)时,才会触发__call__callStatic。在这种情况下,invoke函数确实存在,因此PHP调用它。在引入特征之前,混合非静态函数和静态函数调用是“接受”的“混合函数”方式。

示例:

<?php
class A
{
  public function __call($name, $args)
  {
    echo "__call $name\n";
  }

  static public function __callStatic($name, $args)
  {
    echo "__callStatic $name\n";
  }

  public function foo()
  {
    echo "foo()\n";
  }
}

A::foo();

您将看到已调用定义的foo()方法。

这只是需要更新库以符合PHP不断发展的标准的情况。让一个方法同时充当静态方法和非静态方法只是一种糟糕的做法,PHP最终会让人们这样做。

稍微偏离主题,但同样值得注意的是,当从对象的上下文中调用方法时,__call始终优先于__callStatic。例如,在此示例中,__call方法用于A::bar(),因为它不明确。

class A
{
   public function test()
   {
     A::bar();
   }

   public function __call($name, $args) {}
   static public function __callStatic($name, $args) {}
}