I am using the magic __call method in PHP. Sometimes the function I call is a number. For example t开发者_如何学Che class name is example, then sometimes I want to call example::32
Is this possible or should I look at another alternative.
Sure it's possible. You just need to change the call syntax. $foo->32()
is not valid and will give a fatal error. But $foo->{'32'}()
is valid syntax. Now, you can't define a function 32, but you can use __call to execute it...
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
Or in 5.3 with static methods, it gets a bit harder:
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
No, this is not possible as 32
is not a valid property name. You will get a parse error like:
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in …
Furthermore example::32
would refer to a static attribute and not a method (example::32()
would if 32
would be a valid name, but you need to use __callStatic
to fetch these calls).
If you want to access non-existing attributes, use the magic methods __get
and __set
instead.
精彩评论