开发者

'Method name must be a string' when using __call method in php

开发者 https://www.devze.com 2023-01-01 04:41 出处:网络
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

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消