我刚刚升级到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 ) {
...
} );
至少可以说是笨拙的。还有更好的方法吗?
答案 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+错误:
答案 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) {}
}