我在PHP中使用魔术__call方法。有时我调用的函数是一个数字。例如,类名是示例,有时我想调用example :: 32
这是可能的还是我应该看另一种选择。
答案 0 :(得分:1)
当然有可能。您只需要更改调用语法。 $foo->32()
无效,会发出致命错误。但$foo->{'32'}()
是有效的语法。现在,您无法定义函数32,但您可以使用__call来执行它...
class Foo {
public function __call($f, $args) {
echo $f;
}
}
$foo = new Foo;
$foo->32(); //Fatal Error
$foo->{32}(); //Fatal Error
$foo->{'32'}(); // "32" is printed
$x = 32;
$foo->$x(); //Fatal Error
$x = '32';
$foo->$x(); // "32" is printed
$x = 32;
$foo->{(string)$x}(); // "32" is printed
call_user_func(array($foo, '32')); // "32" is printed
或者在5.3中使用静态方法,它会变得更难:
class Foo {
public static function __callStatic($f, $args) {
echo $f;
}
}
Foo::32(); //Fatal Error
Foo::{32}(); //Fatal Error
Foo::{'32'}(); //Fatal Error
$x = 32;
Foo::$x(); //Fatal Error
$x = '32';
Foo::$x(); // "32" is printed
$x = 32;
Foo::{(string)$x}(); //Fatal Error
call_user_func(array('foo', '32')); //Fatal Error
答案 1 :(得分:0)
不,这是不可能的,因为32
不是有效的属性名称。您将得到一个解析错误,如:
解析错误:语法错误,意外T_LNUMBER,期待T_STRING或T_VARIABLE或'$'...
此外example::32
会引用静态属性,而不是方法(example::32()
如果32
是有效名称,但您需要使用__callStatic
来获取这些电话)。
如果您想访问不存在的属性,请改用magic methods __get
and __set
。