在php中使用__call方法时,'方法名称必须是字符串'

时间:2010-05-28 15:49:31

标签: php

我在PHP中使用魔术__call方法。有时我调用的函数是一个数字。例如,类名是示例,有时我想调用example :: 32

这是可能的还是我应该看另一种选择。

2 个答案:

答案 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