您不能通过添加()
来调用回调函数。这仅适用于使用lambda函数和实现__invoke
魔术方法的对象的PHP 5.3(另请参见内部get_closure
对象处理程序)。
首先,尽管您所说的话不对,但这是行不通的:
<?php
class Example {
private static $_callbacks;
private static function do_foo() { echo "foo"; }
private static function do_bar() { echo "bar"; }
public static function do_callbacks() {
self::$_callbacks['foo'] = array('Example','do_foo');
self::$_callbacks['bar'] = array('Example','do_bar');
self::$_callbacks['foo']();
self::$_callbacks['bar']();
}
}
Example::do_callbacks();
但是如果
self::$_callbacks ['foo']
是一个lambda函数,它甚至无法正常工作:
<?php
class Example {
private static $_callbacks;
public static function do_callbacks() {
self::$_callbacks['foo'] = function () { echo "foo"; };
self::$_callbacks['foo']();
}
}
Example::do_callbacks();
原因是解析器。上述代码编译为:
Class Example:
Function do_callbacks:
(...)
number of ops: 16
compiled vars: !0 = $_callbacks
line # * op fetch ext return operands
---------------------------------------------------------------------------------
6 0 > EXT_NOP
7 1 EXT_STMT
2 ZEND_FETCH_CLASS
3 ZEND_DECLARE_LAMBDA_FUNCTION '%00%7Bclosure%7D%2Ftmp%2Fcp9aicow0xb7fcd09b'
4 FETCH_W static member $2 '_callbacks'
5 ZEND_ASSIGN_DIM $2, 'foo'
6 ZEND_OP_DATA ~3, $4
9 7 EXT_STMT
8 FETCH_DIM_R $5 !0, 'foo'
9 ZEND_FETCH_CLASS
10 ZEND_INIT_STATIC_METHOD_CALL $6, $5
11 EXT_FCALL_BEGIN
12 DO_FCALL_BY_NAME 0
13 EXT_FCALL_END
10 14 EXT_STMT
15 > RETURN null
实际上从未获取静态成员(除了赋值lambda之外)。事实上,PHP编译一个名为
$_callbacks
的变量,在运行时并不存在;因此出现了错误。我承认这可能不是一个错误,但至少是解析器的一个特例。它首先评估
$_callbacks['foo']
部分,然后尝试调用由该评估结果得出的静态函数名称。
总之,还是使用
call_user_func
或
forward_static_call
。