Ответ 1
PHP использует концепцию, которую мы называем оптимизацией скомпилированных переменных (CV). Это означает, что вместо использования хеш-таблицы, которая сопоставляет имена переменных своим значениям, мы используем простой массив и индекс. Компилятор знает, какое имя переменной соответствует индексу. Выполнение поиска индекса массива значительно быстрее, чем поиск хеш-таблиц.
Переменная $this
также будет сохранена таким образом, и ее индекс будет запомнен как op_array->this_var
. Если не найдено значение $this
, это значение остается неинициализированным в -1
. При нажатии нового сценария выполнения на стек виртуальной машины PHP проверяет op_array->this_var
и, если он не является -1
, инициализирует запись переменной $this
.
При доступе к переменной переменной PHP будет проходить через таблицу CV и строить из нее правильный хэш-таблицу. Конечно, он добавит только переменные, которые фактически находятся в таблице CV, поэтому, если он не содержит $this
, вы получите переменную undefined.
Теперь рассмотрим ваши три случая:
-
$this
и${"this"}
совпадают с компилятором PHP (ведь имя переменной известно в момент компиляции в обоих случаях). - Поскольку компилятор PHP 5.x еще не выполняет сгибание постоянных выражений, он, однако, не сможет обнаружить, что
${"th"."is"}
является$this
доступом. Таким образом,this_var
остается неинициализированным. - В последнем случае вы используете обычное использование
$this
, поэтомуthis_var
будет установлен и также доступен через поиск переменной-переменной.
Обратите внимание, что в PHP 7 ситуация отличается - мы всегда ставим this_var
на поиск переменных переменных, поэтому непрямые поисковые запросы $this
всегда должны работать.