#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, так что я вроде как привык к этому в любом случае :). Спасибо за помощь.