PHP 5.x против 7.x - свойства объекта, использующие переменные, ведущие себя по-разному - PullRequest
0 голосов
/ 24 апреля 2018

Представьте себе следующую ситуацию в PHP 5.x, где у меня есть класс.В этом классе используются две переменные:

$this->my_row;  # contains a row from a mysqli query, object style
$field['name']; # contains (just) the name of the field in the row i want to retrieve

Предположим, что $ this-> my_row содержит строку с 2 полями (и их значениями):

exam='bio'
grade='A'

Также давайтепредположим:

$field['name']='exam';

Тогда, если я использую этот код:

$value = $this->my_row->$field['name']

$value будет оцениваться как «био»

Это работало как очарование в течение многих лет,ТЕПЕРЬ я начал использовать PHP 7 (лучше поздно, чем никогда).С тех пор код больше не работает (результат всегда пуст).Чтобы достичь старого результата, мне нужно сделать шаг между:

$tmp_name=$field['name'];
$this->my_row->$tmp_name;

Есть идеи почему?Я предполагаю, что ['имя'] является виновником.может быть, способ, которым PHP 7 оценивает порядок операторов?

1 Ответ

0 голосов
/ 24 апреля 2018

Это объяснено в руководстве по переходу с PHP 5.6 на 7.0 .

В целом, есть две причины для этого:

  1. Неоднозначность; my_row->$field['name'] можно интерпретировать как:
    • {my_row->$field}['name']
    • my_row->{$field['name']}
  2. Согласованность, так как PHP 5 иногда оценивает такие неоднозначные операторы как слева направо, а иногда как справа налево, в зависимости от случая. За этим трудно следовать, и он легко допускает ошибки (или заставляет вас всегда ставить круглые скобки, чтобы быть уверенным).

    PHP 7 просто вводит надежное правило слева направо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...