Почему я не могу напрямую использовать возвращаемые значения функций в качестве динамических имен классов в PHP?
Начиная с 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)?
1 ответ
Решение
Я не знаю, назову ли я это "ошибкой", но это определенно идиосинкразия PHP до PHP 7. Эта проблема и целый ряд подобных проблем были решены с помощью унифицированного синтаксиса переменных RFC.