调用静态方法,将类名存储为实例变量

时间:2014-10-23 01:33:25

标签: php

考虑这个脚本

class B
{
    static public function hi() { echo "hi\n"; }
}
class A
{
    private $name = 'B';

    public function __construct()
    {
        // This doesn't parse
        // $this->name::hi();

        // But this works fine
        $class = $this->name;
        $class::hi();
    }
}
new A();

知道如何/我是否可以让第一个例子$this->name::hi();解析并工作?

2 个答案:

答案 0 :(得分:2)

Zend PHP解析器的当前实现仅支持直接在类名或变量上进行的静态方法调用。这是语法:

%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"

function_call:
    name argument_list
        { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }
|   class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
        { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
|   variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
        { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
|   callable_expr argument_list
        { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }

来源:https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L890

答案 1 :(得分:-1)

鉴于在你目前的情况下你需要在类a中使用类b的方法,以这种方式处理它似乎非常直观。此外,调用另一个类的方法的可用性根本不存在,您需要使用:

call_user_func(array($this->name, 'hi'));

一种方法是简单地要求B类作为A类的构造函数的依赖:

class B
{
    static public function hi() { echo "hi\n"; }
}

class A
{
    private $b;

    public function __construct(B $b)
    {

        $b::hi();

    }
}
new A(new B);

这可能与您正在寻找的单线方法非常接近。