2012-06-12 3 views
1

Одна вещь, которая всегда подслушивала меня (и всех остальных, когда-либо) о PHP, - это ее несогласованность в названии функций и параметрах. Еще одним недавним раздражением является его тенденция запрашивать параметры функции по ссылке, а не по значению.Зачем нужно передавать примитивные параметры по ссылке в PHP?

Я быстро просмотрел руководство по PHP и нашел функцию sort() в качестве примера. Если бы я выполнял эту функцию, я бы взял массив по значению, сортировал его в новый массив и возвращал новое значение. В PHP sort() возвращает логическое значение и изменяет существующий массив.

Как я хотел бы назвать sort():

$array = array('c','a','b'); 
$sorted_array = sort($array); 

Как PHP хочет, чтобы позвонить sort():

$array = array('c','a','b'); 
sort($array); 
$sorted_array = $array; 

И, кроме того, следующий бросает фатальную ошибку: Fatal error: Only variables can be passed by reference

sort(array('c','a','b'); 

Я бы предположил, что часть этого может быть наследие старых дней PHP, но, должно быть, причина была такова. Я могу увидеть значение при передаче объекта по ссылочному идентификатору, например, PHP 5+ (который, как я полагаю, представляет собой промежуток между передачей по ссылке и передачей по значению), но не в случае строк, массивов, целых чисел и т. Д.

Я не эксперт в области компьютерных наук, так как вы, вероятно, можете собраться, я пытаюсь понять некоторые из этих концепций, и мне любопытно, есть ли причина, таким образом, или это просто остатки.

ответ

2

Основная причина в том, что PHP был разработан программистами C, и это очень парадигма C-программирования. В C имеет смысл передать указатель на структуру данных, которую вы хотите изменить. В PHP не так много (между прочим, потому что ссылки не совпадают с указателем).

2

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

Если сортировка должна была вернуть новую копию массива, то для каждого вызова sort(); PHP-движок должен был скопировать массив в новый (снижение скорости и увеличение стоимости пространства), и у вас не было бы способа контролировать это поведение.

Если вам нужен исходный массив, чтобы быть не отсортированы (и это не происходит так часто), то просто сделать:

$copy = $yourArray; 
sort($yourArray); 
Смежные вопросы