考虑这个脚本
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();
解析并工作?
答案 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);
这可能与您正在寻找的单线方法非常接近。