Начиная с PHP 5.3, в качестве имени класса можно использовать переменную не только для создания объекта, но и для даже для статических методов:
$className = 'My\Name\Spaced\Thing';
$thing = $className::foo('hello world');
Однако, если я пытаюсь использовать возвращаемое значение функции или метода вместо фактической переменной, я получаю ошибку:
function getClassName()
{
return 'My\Name\Spaced\Thing';
}
// Raises "syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)"$thing = getClassName()::foo('hello world');
Это, с другой стороны, работает просто отлично:
$className = getClassName();
$thing = $className::foo('hello world');
Что дает? Я только что нашел ошибку в синтаксическом процессоре PHP (5.6)?
Я не знаю, назову ли я это «ошибкой», но это определенно идиосинкразия PHP до PHP 7. Это и целый ряд подобных проблем были решены Единый переменный синтаксис RFC.
Других решений пока нет …