2013-11-24 71 views
2

叫我刚刚升级到PHP 5.5.3和我注意到,Underscore.php抛出一个奇怪的错误: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) { 
    ... 
}); 

这是笨拙的,至少可以说。有没有更好的办法?

回答

5

我相信你得到一个E_STRICT错误,它看起来像这样已经很长一段时间的一个问题:

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

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

E_STRICT自PHP 5.4起仅成为E_ALL的一部分。这可以解释为什么只有在升级后才出现。

更新:看看这个叉Underscore.php的,它有固定的这些PHP 5.4+错误:

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

0

Plowing through the Underscore.php source, I don't understand why this error is being thrown since the call to invoke should be handled by the __callStatic handler:

这就是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) {} 
} 
+0

不确定你的答案是什么。 'invoke'方法确实存在,只是不是静态的。所以调用'__ :: invoke'会触发'__callStatic',它会调用'__'实例的'invoke',我明白了,谢谢。 – Luke

+0

'__callStatic'不*被调用。阅读我的答案并运行我的第一个例子。 :) – Matthew

相关问题