';方法名称必须是字符串';在php中使用_调用方法时

';方法名称必须是字符串';在php中使用_调用方法时,php,Php,我正在使用PHP中的magic\uuuu调用方法。有时我调用的函数是一个数字。例如,类名是example,那么有时我想调用example::32 这是可能的,还是我应该考虑另一种选择。不,这是不可能的,因为32不是有效的属性名称。您将得到如下解析错误: 分析错误:语法错误,意外的T_LNUMBER,应为T_字符串或T_变量或“$” 此外,example::32将引用一个静态属性,而不是一个方法(example::32()如果32将是一个有效的名称,则会引用,但您需要使用来获取这些调用) 如果要访

我正在使用PHP中的magic\uuuu调用方法。有时我调用的函数是一个数字。例如,类名是example,那么有时我想调用example::32


这是可能的,还是我应该考虑另一种选择。

不,这是不可能的,因为
32
不是有效的属性名称。您将得到如下解析错误:

分析错误:语法错误,意外的T_LNUMBER,应为T_字符串或T_变量或“$”

此外,
example::32
将引用一个静态属性,而不是一个方法(
example::32()
如果
32
将是一个有效的名称,则会引用,但您需要使用来获取这些调用)


如果要访问不存在的属性,请改用。

否,这是不可能的,因为
32
不是有效的属性名称。您将得到如下解析错误:

分析错误:语法错误,意外的T_LNUMBER,应为T_字符串或T_变量或“$”

此外,
example::32
将引用一个静态属性,而不是一个方法(
example::32()
如果
32
将是一个有效的名称,则会引用,但您需要使用来获取这些调用)


如果要访问不存在的属性,请改用。

确保这是可能的。您只需要更改调用语法<代码>$foo->32()无效,将出现致命错误。但是
$foo->{'32'}()
是有效的语法。现在,您不能定义函数32,但可以使用_调用来执行它

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

当然有可能。您只需要更改调用语法<代码>$foo->32()无效,将出现致命错误。但是
$foo->{'32'}()
是有效的语法。现在,您不能定义函数32,但可以使用_调用来执行它

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

我不认为
32
是一个函数的有效名称。我不认为
32
是一个函数的合理名称。我不认为
32
是一个函数的有效名称。我不认为
32
是一个函数的合理名称。你知道这是否与函数方法结合使用吗。这不起作用:方法_存在('Foo','32')<代码>方法_exists()仅适用于已定义的函数。因此,任何导致执行
\u call()
的调用都将返回false…您知道如何检查函数是否将通过吗。因为我必须检查函数是否通过其他方法,不是所有方法都是神奇的。你不需要检查。。。在
\u call()
中,检查它是否可以处理该方法。否则,
抛出新的BadMethodCallException(“此函数不存在”)。然后,尝试{}catch(){}异常。这样,你尝试处理它,如果失败了,你知道这个方法不存在。。。或者添加一个返回bool的方法
isCallable($name){}
。主体类似于数组($this->methods)中的
returnmethod_exists($this,$name)|
其中
$this->methods
包含了调用()可以处理的所有方法……您知道这是否与函数method\u一起工作吗。这不起作用:方法_存在('Foo','32')<代码>方法_exists()
仅适用于已定义的函数。因此,任何导致执行
\u call()
的调用都将返回false…您知道如何检查函数是否将通过吗。因为我必须检查函数是否通过其他方法,不是所有方法都是神奇的。你不需要检查。。。在
\u call()
中,检查它是否可以处理该方法。否则,
抛出新的BadMethodCallException(“此函数不存在”)。然后,尝试{}catch(){}异常。这样,你尝试处理它,如果失败了,你知道这个方法不存在。。。或者添加一个返回bool的方法
isCallable($name){}
。主体类似于数组($this->methods)中的
returnmethod_exists($this,$name)|
其中
$this->methods
包含了_call()可以处理的所有方法…@Saif Bechan:但是为什么要调用这样的方法呢?目的是什么?例如,我有一个“问题”类和一个“列表”方法。这列出了所有的问题。问题->列表()。现在我想创建一个神奇的函数调用。如果我调用questions->32(),我想显示id为32的问题。@Saif Bechan:好吧,综合的方法是命名方法
get
getById
,如果有更多的方法来获取一个问题/几个问题。@Saif Bechan:但是为什么要调用这样的方法呢?目的是什么?例如,我有一个“问题”类和一个“列表”方法。这列出了所有的问题。问题->列表()。现在我想创建一个神奇的函数调用。如果我调用questions->32(),我想显示id为32的问题。@Saif Bechan:好的,综合的方法是命名方法
get
getById
,如果有更多的方法来获取一个问题/几个问题。