В PHP 7.0:
$a = 'this'; return isset( $$a ); // returns true
Но в PHP 7.1:
$a = 'this'; return isset( $$a ); // returns false
Кто-нибудь знает, почему это происходит?
Это связано с этим изменением в 7.1:
Исправлены несоответствия $this Хотя $this считается специальной переменной в PHP, ей не хватало надлежащие проверки, чтобы убедиться, что оно не использовалось в качестве имени переменной или переназначены. Теперь это исправлено, чтобы гарантировать, что $this не может быть пользовательской переменной, переназначенной на другое значение или глобализованным. http://php.net/manual/en/migration71.other-changes.php#migration71.other-changes.inconsistency-fixes-to-this
$this
Хотя $this считается специальной переменной в PHP, ей не хватало надлежащие проверки, чтобы убедиться, что оно не использовалось в качестве имени переменной или переназначены. Теперь это исправлено, чтобы гарантировать, что $this не может быть пользовательской переменной, переназначенной на другое значение или глобализованным.
http://php.net/manual/en/migration71.other-changes.php#migration71.other-changes.inconsistency-fixes-to-this
Этот RFC объясняет это более подробно, хотя также говорится:
Отключить возможность переназначения $this косвенно через $$ Попытка переназначить присвоение с $this по $$ приведет к исключение ошибки. $a = "this"; $$a = 42; // throw new Error("Cannot re-assign $this") Все еще можно прочитать значение $this через $$.
$$
Попытка переназначить присвоение с $this по $$ приведет к исключение ошибки.
$a = "this"; $$a = 42; // throw new Error("Cannot re-assign $this")
Все еще можно прочитать значение $this через $$.
(Акцент мой.)
isset, кажется, имеет собственную особую обработку $$ для $this, которая запрещает его видеть. Я не уверен, является ли это намеренным или побочным продуктом этих изменений.
isset