Tengo cierto conocimiento de C ++ y sé que los punteros se usan comúnmente allí, pero he comenzado a mirar el código fuente PHP y nunca veo código usando referencias en los métodos.
En cambio, el código siempre usa un valor de retorno en lugar de pasar la referencia a la variable al método, que luego cambia el valor de esa variable y simplemente lo devuelve.
He leído que usar referencias usa menos memoria, entonces ¿por qué no se usan en PHP?
return array($foo, $bar);
ylist($A, $B) = foobar();
Respuestas:
Su afirmación de que las referencias rara vez se usan es incorrecta. Como otros ya han mencionado que hay un montón de funciones nativas que usan referencias, ejemplos notables incluyen las funciones de ordenación de matrices y
preg_match()
/preg_match_all()
. Si está utilizando alguna de estas funciones en su código, también está utilizando referencias.Continuando, las referencias en PHP no son punteros. Dado que proviene de un entorno de C ++, puedo entender la confusión, pero las referencias de PHP son una bestia completamente diferente, son alias de una tabla de símbolos . Cualquier aumento de rendimiento que podría haber esperado de las referencias de C ++ simplemente no se aplica a las referencias de PHP.
De hecho, en la mayoría de los escenarios, pasar por valor es más rápido y requiere menos memoria que pasar por referencia. Zend Engine, el núcleo de PHP, utiliza un mecanismo de optimización de copia en escritura que no crea una copia de una variable hasta que se modifica. Pasar por referencia generalmente rompe el patrón de copia en escritura y requiere una copia, ya sea que modifique el valor o no.
No tenga miedo de usar referencias en PHP cuando lo necesite, pero no lo haga solo como un intento de micro-optimización. Recuerde, la optimización prematura es la raíz de todo mal .
Otras lecturas:
fuente
f($obj)
dadofunction f($x) { $x = new X; }
, habría hecho$obj
referencia a un objeto diferente al anterior a la llamada af()
. Sin embargo, dado que los objetos no se pasan por referencia, $ obj no se modifica si tuviera que ejecutar esto con PHP. De esa manera, PHP hace lo mismo que Java.PHP ya hace una copia en escritura donde no crea un nuevo valor hasta que cambie algo, por lo que no se guarda mucha memoria al usar referencias. Si lo hace, incluso puede meterse con algunas cosas que PHP hace internamente para reducir el uso de memoria, lo que empeora las cosas.
Agregue a eso el hecho de que las referencias hacen que las cosas sean demasiado mágicas en general. El valor predeterminado, y por lo tanto lo que la mayoría de la gente espera, es pasar por valor; cuando paso
$i
a una función, se complica enormemente tener que preocuparme si esa función cambia misteriosamente$i
a otra completamente diferente y, por lo tanto, hacer copias defensivas por si acaso. (Ya puede modificar$i
si el valor es un objeto, pero en mi opinión no debería).Básicamente, solo encontraría que el paso por referencia es útil para los parámetros "out", es decir, las variables que espero recuperar de la función en lugar de pasar, a la
preg_match
's&$matches
. Incluso para funciones que modifican claramente el objeto que se pasa, comosort
oarray_pop
, eso se siente un poco asqueroso ... pero eso es con lo que estamos atrapados.fuente
PHP es un lenguaje orientado a la web.
Las páginas web se sirven rápidamente y deben ser livianas.
El programa PHP habitual vive una fracción de segundo y consume unos cientos de kilobytes de memoria.
No hay uso para tales optimizaciones.
fuente
Algunas razones sobre la marcha:
fuente
Creo que esto es solo una elección de los desarrolladores, nada que ver con el lenguaje. Un montón de código PHP (incorporado y no) usa referencias. Eche un vistazo a las funciones de matriz en PHP, muchas de ellas usan referencias.
preg_match
utiliza referenciasCreo que una de las razones por las que los desarrolladores eligen no usar referencias es porque puede ser confuso. Llama a una función y una de las variables puede (o no) actualizarse porque era una referencia. Entonces, cuando depura, puede que no esté claro por qué el valor de
$x
jsut cambió mágicamente.fuente
El problema fundamental con su pregunta es que asume que esto también es común en C ++. No lo es No nos gustan los parámetros de salida y los usamos lo menos posible, solo son muy comunes en las API de estilo C.
fuente
Conozco muchas funciones php que lo hacen. Echa un vistazo
preg_match()
por ejemplo.$matches
será aprobado por referenciaSi desea escribir una función para usted que tome argumentos por referencia, use la siguiente sintaxis
$ a y $ b se pasan por referencia $ c se pasa por valor.
fuente