Строгий оператор необходим в PHP 7.3, но не в PHP 7.2 - PullRequest
0 голосов
/ 27 апреля 2020

Я использовал эту страницу в качестве ссылки для просмотра заметок журнала изменений при переходе с PHP 7,2 на 7,3 , но я не могу найти там ссылку строгого оператора или ===.

Проблема в том, что в одном из моих проектов приведенный ниже код работал без ошибок, когда мой проект был на PHP 7.2, но когда я перешел на PHP 7.3, все работает нормально кроме этого кода

if ($a == $b)

Это выдает ошибку

Fatal error: Nesting level too deep - recursive dependency?

, которая исправлена ​​с помощью

if ($a === $b)

, где в обоих приведенных выше примерах $a & $b получены из FieldItemList , но я не уверен, упомянуто ли это где-то в руководстве по миграции, которое я мог пропустить?

1 Ответ

0 голосов
/ 28 апреля 2020

В справочнике по https://www.php.net/manual/en/language.oop5.object-comparison.php сказано:

При использовании оператора сравнения (==) переменные объекта сравниваются простым способом, а именно: два экземпляра объекта равны, если имеют одинаковые атрибуты и значения (значения сравниваются с ==) и являются экземплярами одного и того же класса.

При использовании оператора тождества (===) переменные объекта идентичны, если и только если они ссылаются на один и тот же экземпляр одного и того же класса.

Это означает, что если ваш FieldItemList :: $ parent указывает на себя, оператор == завершается рекурсией, как это является циклическим рефлексом. Оператор === только проверяет идентичность и не исследует свойства объекта, поэтому не заканчивается бесконечной рекурсией.

Я не знаю, почему миграция PHP должна вызывать это. Может быть, миграция была одним из изменений, и проблема кроется где-то еще?

...