В соответствии с документацией PHP о Переменные переменные:
$это специальная переменная, которая не может быть динамически указана
Однако кажется, что он ложный, по крайней мере, на версии PHP, я протестировал (5.5.12).
class ThisIsBugged
{
public function __construct()
{
${'this'}->doSomething(); // This works, while it shouldn't
}
}
Вопрос № 1. Как он может работать? Согласно документации, он не должен.
Но там больше.
class ThisIsBugged
{
public function __construct()
{
// This does not work, but it could. See below.
${'th' . 'is'}->doSomething();
}
}
Он останавливает выполнение, как ожидалось:
Примечание PHP: переменная Undefined: this
PHP Неустранимая ошибка: вызов функции-члена doSomething() на не-объект.
Обратите внимание, что выражение {'th' . 'is'}
было оценено: "Undefined variable: this".
Однако (это самая странная вещь), явно ссылаясь на специальную переменную $this
, фиксирует все динамические ссылки, используемые до или после этого в рамках метода.
class ThisIsBugged
{
public function __construct()
{
// Now it works while it shouldn't
${'th' . 'is'}->doSomething();
// This fixes both the previous and the subsequent calls
$unused = $this;
// Now it works while it shouldn't
${'th' . 'is'}->doSomething();
}
}
Вопрос № 2. Как явная ссылка на $this
может исправить все остальные динамические ссылки на $this
, присутствующие во всем методе?