¿Por qué uno querría pasar parámetros de tipo primitivo por referencia en PHP?

Una cosa que siempre me ha molestado a mí (ya todos los demás, siempre) sobre PHP es su inconsistencia en los nombres y parámetros de las funciones. Otra molestia más reciente es su tendencia a solicitar parámetros de función por referencia en lugar de por valor.

Hice una búsqueda rápida en el manual de PHP y encontré la función sort() como ejemplo. Si estuviera implementando esa función, tomaría una matriz por valor, la ordenaría en una nueva matriz y devolvería el nuevo valor. En PHP, sort() devuelve un valor booleano y modifica la matriz existente.

como me gustaria llamar sort():

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

Cómo PHP quiere que llame sort():

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

Y además, lo siguiente arroja un error fatal: Fatal error: Only variables can be passed by reference

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

Me imagino que parte de esto podría ser un legado de los viejos tiempos de PHP, pero debe haber una razón por la que las cosas se hicieron de esta manera. Puedo ver el valor de pasar un objeto por ID de referencia como lo hace PHP 5+ (que supongo que es algo entre pasar por referencia y pasar por valor), pero no en el caso de cadenas, matrices, enteros y tal.

No soy un experto en el campo de las ciencias de la computación, por lo que probablemente puedas deducir que todavía estoy tratando de comprender algunos de estos conceptos, y tengo curiosidad sobre si hay una razón por la cual las cosas están configuradas de esta manera, o si es sólo un sobrante.

preguntado el 12 de junio de 12 a las 21:06

2 Respuestas

La razón principal es que PHP fue desarrollado por programadores de C, y esto es en gran medida un paradigma de programación en C. En C, tiene sentido pasar un puntero a una estructura de datos que desea cambiar. En PHP, no tanto (Entre otras cosas, porque las referencias no son lo mismo que un puntero).

Respondido el 12 de junio de 12 a las 21:06

Creo que esto se hace por razones de velocidad.
La mayoría de las veces necesita ordenar la matriz en la que está trabajando, no una copia.

Si sort debería haber devuelto una nueva copia de la matriz, cada vez que llame a sort(); el motor PHP debería haber copiado la matriz en una nueva (reduciendo la velocidad y aumentando el costo del espacio) y no tendría forma de controlar este comportamiento.

Si necesita que la matriz original no esté ordenada (y esto no sucede tan a menudo), simplemente haga lo siguiente:

$copy = $yourArray;
sort($yourArray);

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.