Вызов статического метода с именем класса, хранящимся как переменная экземпляра

Рассмотрим этот скрипт

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(); анализировать и работать?

Solutions Collecting From Web of "Вызов статического метода с именем класса, хранящимся как переменная экземпляра"

Текущая реализация парсера 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

Учитывая, что в ваших нынешних условиях вам нужен метод класса b в классе a, кажется довольно интуитивно понятным, чтобы подойти к нему таким образом. Кроме того, доступность вызова метода другого класса просто отсутствует, вам нужно будет использовать:

 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); 

Вероятно, это похоже на тот подход, который вы ищете, который вы можете получить.