Есть ли проблема, если вы выполните сортировку (& $ myArray)? - PullRequest
0 голосов
/ 01 сентября 2011

PHP руководство говорит, что вы должны сделать sort($array). $array будет передано по ссылке, поэтому sort() изменит $myArray.

Мне просто интересно, есть ли какие-либо проблемы или последствия, если вы делаете sort(&$myArray).

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Чтобы дать более подробный ответ:

  • Это будет работать без проблем в PHP 5.2 и ранее.
  • Это вызовет предупреждение E_DEPRECATED (иногда) в PHP 5.3
  • Скорее всего, перестанет работать на PHP 5.4. (Что чередуется между отказом и ошибками нарушения памяти. Еще не завершено, но это изменение, скорее всего, останется.)

Обоснование отказа от передачи по ссылкам носит диффузный характер. В основном это чистота кода. Во-вторых, новички обычно злоупотребляли им, что приводило к побочным эффектам, если их не контролировать. (Если злоупотребление новичком когда-либо являлось веской причиной для устаревания, то mysql_query давно бы уже не было.)
И в-третьих, на самом деле существуют некоторые проблемы управления внутренней памятью при передаче параметров по ссылке, когда ZendVM этого не ожидает. (У Quercus и Project Zero таких проблем нет.)

1 голос
/ 01 сентября 2011

Короткий ответ: ничего не изменится.

Длинный ответ заключается в том, что вы должны избегать ссылок любой ценой.Они являются основным источником ошибок, и вы действительно не нуждаетесь в них.Есть несколько редких случаев, когда для решения проблемы требуются ссылки, но они очень малы и очень далеки друг от друга.

Причина, по которой ссылок много, - до PHP 5.0, понятия не былоссылок на объекты.Таким образом, вам нужно было передать все объекты по ссылке (и вернуть их по ссылке), чтобы получить любую функциональность ОО (разрешить методы для изменения объекта и т. Д.).Но начиная с версии 5.0 (которой уже десять лет), она больше не нужна.Чтобы понять, как это работает сейчас, я бы посоветовал прочитать этот ответ .

Так что сделайте более понятное и правильное использование:

sort($myArray);
...