PHP 5.3 и присвоение возвращаемого значения нового по ссылке - PullRequest
11 голосов
/ 12 января 2011

Назначение возвращаемого значения new по ссылке устарело в PHP 5.3. Таким образом,

$obj =& new Foo();

теперь выдает ошибку E_DEPRECATED.

При обновлении большого приложения с большим количеством устаревшего кода до версии 5.3 это приводит к большому количеству нежелательных уведомлений.

В качестве потенциального решения этой проблемы я рассматриваю возможность использования регулярного выражения для поиска и замены всех экземпляров =& new на = new. Например, следующее найдет все файлы PHP и уничтожит все экземпляры =& new:

find ./ -name '*.php' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g'

Ищем ответы на следующие вопросы:

  1. Будет ли это работать нормально? С какими потенциальными проблемами я могу столкнуться?
  2. Если нет, примеры кода, где замена =& new на = new изменит поведение в PHP 5.3.
  3. Известно, что любые примеры популярных библиотек с этим могут вызвать проблемы.
  4. Какие еще идеи вы порекомендуете для исправления огромного количества =& new?

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

Ответы [ 3 ]

15 голосов
/ 12 января 2011

Ваше чувство верно. Как правило, он будет работать нормально, но в некоторых случаях это не так.

Использование =& имеет эти различия с =:

  • =& попытается заставить правую сторону дать ссылку; = не будет - даже если правая сторона способна дать ссылку, как функция, которая возвращает ссылку.
  • =& сломает старый набор ссылок и поместит левую и правую стороны в новую, а = изменит значение всех элементов в том же наборе ссылок, что и левая сторона, на значение с правой стороны.

Первое различие и половина второго в данном случае не имеют значения. После назначения будет только одна переменная со значением нового объекта *, и одноэлементные наборы ссылок не имеют смысла. Однако тот факт, что =& нарушает предыдущий набор ссылок, имеет значение:

<?php

$g = 4;
$v =& $g;
$v = new stdclass();
var_dump($g); // object(stdClass)#1 (0) { }

$g = 4;
$v =& $g;
$v =& new stdclass();
var_dump($g); // int(4)

* Если, возможно, конструктор не утечка ссылки, но даже если она утечка, $this внутри конструктора может быть другой переменной, даже если он указывает на тот же объект. Поэтому я сомневаюсь, что из-за этого можно наблюдать разницу в поведении.

3 голосов
/ 12 января 2011

Да, вы должны просто заменить =& new на = new.Объекты по умолчанию передаются по ссылке в PHP 5.3, поэтому поведение не изменится.

+ 1 для исправления уведомлений вместо их скрытия.

2 голосов
/ 12 января 2011

Не должно быть никаких проблем.В худшем случае это немного замедлит работу вашего приложения на PHP 4, но определенно не изменит функциональность.

Единственная проблема, с которой вы теоретически можете столкнуться, это то, что кто-то написал =& new в строке.Я знаю, что это невероятно, но если вы хотите заменить действительно только все случаи '=' T_WHITESPACE? '&' T_WHITESPACE? T_NEW, вы должны сделать это, используя Tokenizer .

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