У Дерика Ретанса есть старая статья, в которой говорится:
Обратите внимание, что не принимать ссылку от функции, которая возвращает ссылку, вредно. В некоторых случаях PHP будет путаться и вызывать повреждения памяти, которые очень трудно найти и отладить. Также не рекомендуется возвращать статическое значение в качестве ссылки, так как у движка PHP с этим тоже есть проблемы. В PHP 4.3 оба случая могут привести к очень трудно воспроизводимым ошибкам и сбоям PHP и веб-сервера. В PHP 5 все это работает немного лучше. Здесь вы можете ожидать предупреждения, и он будет вести себя «правильно».
Означает ли это, что в PHP 5 нам разрешено игнорировать возвращаемую ссылку из функции?
Под этим я подразумеваю следующее:
function &GetRef(&$array){
$item =& $array[0];
return $item;
}
$array = array(0, 1, 2);
$item =& GetRef($array); /* Normal usage of the function using assign by reference
also known as "accepting" the reference. */
$item = GetRef($array); /* Notice that here we didn't assign by reference.
Are we allowed to ignore the returned reference
and simply do normal assignment? */
В Руководстве по PHP говорится:
В отличие от передачи параметров, здесь [возврат по ссылке] вы должны использовать & в обоих местах — чтобы указать, что вы хотите вернуть по ссылке, а не по копии, и чтобы указать, что для $ нужно делать привязку по ссылке, а не обычное присваивание. мое значение.
В нем явно не говорится, что мы должны принять возвращенную ссылку.
Означает ли это, что мы можем игнорировать возвращаемые ссылки?
In PHP 5, this works all a little bit better. Here you can expect a warning and it will behave “properly”.
Хотя язык немного расплывчатый и расплывчатый, это говорит о том, что это не проблема в PHP5. Поскольку PHP является открытым исходным кодом, я мог бы пройти через все это, проверяя для себя, что он действительно исправлен, и что возвращаемые ссылки будут отброшены, если мой код их не принимает; но поскольку Дерик предполагает, что проблема исправлена в PHP 5, я склонен верить ему, пока не столкнусь с чем-то, что свидетельствует об обратном. - person Mark Baker   schedule 13.08.2013