Параметр PHP4 по ссылке?

#php4 #byref

#php4 #byref

Вопрос:

Я довольно привык к PHP5, но должен написать скрипт синхронизации PHP4, теперь я немного покопаюсь, чтобы найти различия между PHP5 и 4. Проблема в том, что я получаю много противоречий, некоторые сайты сообщают мне, что PHP4 не имеет byref вообще, а другие говорят мне, что эта проблема возникает только при использовании foreach..

Для пояснения примера:

 function doSomething()
{
    $aMyAr = array();
    $oUser = new User();

    addUser($aMyAr, $oUser);
}

function addUser($aDestArray, $oUser)
{
    $aMyAr[] = $oUser;
}
  

Я знаю, вы подумаете, почему бы вам просто не запустить этот скрипт самостоятельно и не выполнить echo / print_r вывод? Ну, по некоторым причинам PHP4 не будет запускаться в последней версии WAMP / XAMPP (да, я перепробовал кучу версий apache, которые, как говорили, совместимы …)

Ответ №1:

Изменение заключалось только в том, что в PHP4 объекты копируются по умолчанию, а в PHP5 они по умолчанию обрабатываются как ссылки. т.е.:

 $a = new stdClass();
$a->prop = "original";
$b = $a;

$b->prop = "changed";
echo $a->prop;

# PHP4 outputs "original" because $a and $b are different objects
# PHP5 outputs "changed" because $a and $b are the same object
  

Когда вы выполняете вызов функции или используете foreach, в PHP4 объект копируется, а не передается по ссылке.

Чтобы аргументы функции PHP4 действовали как в PHP5, вам просто нужно явно передавать аргументы функции по ссылке, т.Е.:

 function someFunc(amp; $someObject) {
  $someObject->prop = "changed";
}

someFunc($a);
echo $a->prop; # prints "changed"
  

Итак, объектно-ориентированный код на PHP4 в итоге оказывается разбросанным amp; повсюду (когда-то писать настоящий OO-код было очень утомительно!).

Другим примером может быть присвоение по ссылке. $b =amp; $a делает с объектами в PHP4 то же, что простой $b = $a делает в PHP5.

Наконец, есть возврат по ссылке. Если вы создаете объект внутри функции и хотите вернуть его (а не возвращать его копию), вам придется определить функцию с помощью amp; , т.е. function amp;someFunc() {} .

Опять же, в документах PHP объясняется синтаксис. Лучшее, что можно сделать на сегодняшний день, это просто не использовать PHP4!

Комментарии:

1. Круто, у меня уже было открыто окно редактирования с небольшой дополнительной информацией для вас, на случай, если это поможет. Написание и особенно отладка OO-кода на PHP4 очень быстро станет раздражающим, если вы привыкли к PHP5 (тогда это было достаточно раздражающим). Мне было бы трудно вернуться назад после стольких лет «нормальных» объектов.

2. Да, я бы с удовольствием использовал PHP5.3 клиент не может обновиться, поскольку у него запущено много веб-приложений, а обновление потребует больших усилий для этого небольшого проекта. К счастью для меня, это всего лишь проект с 10 классами, так что не так уж много всего может пойти наперекосяк. Я просто не использую модификаторы, __construct, foreach, интерфейсы и расширение. Должно быть безопасно, верно?

3. О да, вы определенно можете это сделать, я тоже пишу свою долю устаревшего кода. К вашему сведению, вместо __construct назовите конструктор так же, как класс, и вы можете обычным образом создавать подклассы / расширять. Обычный foreach будет работать нормально, это в PHP4 (с массивами объектов вы должны помнить об использовании ссылок, если хотите, чтобы поведение было похоже на PHP5, т. Е. foreach ($arr as amp;$value) ), вы просто не можете использовать итераторы PHP5.

4. Я использую classname как конструктор также в C # и java, так что я вроде как привык к этому в любом случае :). Спасибо за помощь.