用call_user_func调用非静态方法是否被允许?

12

在 PHP 5.2 中,当我对一个非静态方法使用 call_user_func 时,会收到严格警告:

Strict Standards: Non-static method User::register() cannot be called statically

在 PHP 5.3.1 上,我没有收到这个警告。这是 PHP 5.3.1 的一个错误还是被移除了该警告?


你在PHP5.3上会收到相同的警告。看起来你的php5.3和php5.2配置不同。请查看error_reporting - vooD
1个回答

29
这是完全没问题的,但请注意,您必须传递一个属于您的类的实例对象,以指示非静态方法将在哪个对象上调用。
class MyClass {
    public function hello() {
        echo "Hello, World!";
    }
}

$a = new MyClass();
call_user_func(array($a, 'hello'));

你不应该使用这样的东西。
call_user_func('MyClass::hello');

这将会给你以下警告:
Strict standards: `call_user_func()` expects parameter 1 to be a valid callback,
non-static method `MyClass::hello()` should not be called statically 

(如果这个方法被声明为静态的话,那就完美无缺了...但是它并不是,这里)
更多信息,请查看手册中的[**回调**][1]部分,其中包括以下内容(引用):

一个实例化对象的方法被传递为一个包含对象在索引0处和方法名称在索引1处的数组。


如果您在旧版本的PHP(例如5.2)中遇到严格的错误,那可能是配置的问题 - 我在考虑[**`error_reporting`**][2]指令。
请注意,E_ALL包括E_STRICT从PHP 5.4.0开始(引用):

1
E_STRICT应该在PHP 5.3中包含在E_ALL中。顺便说一下,谢谢,我实例化了对象,然后它就可以正常工作了。 - sandelius
关于实例化对象的问题,没问题 :-) ;;; 我认为即使在 PHP 5.3 中,E_STRICT 也不包含在 E_ALL 中 -- 如果是这样的话,手册上应该会有说明;-) - Pascal MARTIN
在5.5版本中,E_ALL确实包括E_STRICT - Scott Arciszewski
请注意,如果该方法在同一个类中,您可以使用call_user_func(array($this, 'hello'));来调用它,如这里所解释的那样。 - VDarricau
1
一行代码 call_user_func( [ ( new MyClass() ), 'hello' ] ); - Alexey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接