PHP - Почему разные версии PHP возвращают разные результаты, когда я использую $this в качестве динамической переменной в isset()?


В PHP 7.0:

$a = 'this';
return isset( $$a );
// returns true

Но в PHP 7.1:

$a = 'this';
return isset( $$a );
// returns false

Кто-нибудь знает, почему это происходит?

Author: Moein Pakkhesal, 2018-06-25

1 answers

Это связано с этим изменением в 7.1:

Исправления несоответствий в $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 через $$.

(Курсив мой.)

isset похоже, у него есть свое особое отношение к $$ для $this, которое запрещает ему это видеть. Я не уверен, является ли это намеренным или побочным продуктом этих изменений.

 7
Author: deceze, 2018-06-25 12:13:51