Рассмотрим этот скрипт
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();
анализировать и работать?
Текущая реализация парсера 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);
Вероятно, это похоже на тот подход, который вы ищете, который вы можете получить.