代码之家  ›  专栏  ›  技术社区  ›  Saif Bechan

在php中使用调用方法时,“方法名必须是字符串”

php
  •  1
  • Saif Bechan  · 技术社区  · 16 年前

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   ircmaxell    16 年前

    $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
    
        2
  •  0
  •   Gumbo    16 年前

    不,这是不可能的 32

    分析错误:语法错误,意外的T\u LNUMBER,中应为T\u STRING或T\u VARIABLE或'$'

    此外 example::32 将引用静态属性而不是方法( example::32() 如果 将是一个有效的名称,但您需要使用 __callStatic 去接这些电话)。

    magic methods __get and __set 相反。

    推荐文章