2010-01-28 19 views
29

Me pregunto si es una buena práctica pasar por referencia cuando solo está leyendo una variable, o si siempre debe pasarse como un valor.Cuándo pasar por referencia en PHP

Ejemplo con pase por referencia:

$a = 'fish and chips'; 
$b = do_my_hash($a); 
echo $b; 

function &do_my_hash(&$value){ 
    return md5($value); 
} 

Ejemplo con pase por valor:

$a = 'fish and chips'; 
$b = do_my_hash($a); 
echo $b; 

function do_my_hash($value){ 
    return md5($value); 
} 

que es mejor? Por ejemplo, si tuviera que ejecutar un ciclo con 1000 rondas?

Ejemplo de bucle:

for($i = 0 ; $i < 1000 ; $i++){ 
    $a = 'Fish & Chips '.$i; 
    echo do_my_hash($a); 
} 

Respuesta

44

Si se refiere a pasar un valor (lo que la función no lo modifica), no hay ninguna razón para pasarlo por referencia: que sólo produce hacer que su código sea más difícil de entender, ya que la gente piensa "esta función podría modificar lo pasaré a ella — oh, no lo modifica?"

En el ejemplo que nos ha facilitado, su do_my_hash fu nction no modifica el valor que le está pasando; entonces, no usaría una referencia.

Y si usted está preocupado por el rendimiento, usted debe leer este reciente post: Do not use PHP references:

Otra razón la gente utiliza de referencia es ya que piensan que hace que el código más rápido. Pero esto está mal. Incluso es peor: ¡Las referencias hacen sobre todo el código más lento! Sí, las referencias a menudo hacen el código más lento - Lo siento, solo tuve que repetir esto para dejarlo en claro.

En realidad, este artículo podría ser una lectura interesante, incluso si no está principalmente preocupado por el rendimiento ;-)

+3

Estaba pensando en la eficiencia. Como la función no cambia el parámetro, sería mejor pasar por referencia, ya que no necesita copiar el valor. Si el $ a = "bla bla bla ... [texto con 10.000 caracteres ...]"; ... 10.000 caracteres requerirían mucha memoria, así que en lugar de copiarlos, envíelos por referencia ... –

+0

Lo usaría muy poco, y solo si tiene la intención de devolverle un valor similar al que me entregó. Crear un hash md5 de algo lo está cambiando por completo, por lo que no querrá pasar por referencia. –

+0

En este caso, el artículo al que me he vinculado es algo que debería leer de forma inmediata ;-) ;; la oración que cité, por supuesto, y hay una explicación justo después de * (que no cité) * ;; PHP no es C, por ejemplo ^^ –

2

paso por referencia no ofrece ningún beneficio si no se desea modificar este valor en el interior la función. Intento utilizar el valor de paso por valor tanto como sea posible, ya que es mucho más fácil de leer, y el flujo del script es más consistente.

3

La alegría de la micro-optimización. :-)

Para ser honesto, no se gana mucho si se pasan variables 'normales' por referencia (a menos que desee afectar su valor en su alcance original). Además, dado que los objetos PHP 5 se pasan automáticamente por referencia.

8

Una buena práctica de programación es siempre pasar el valor siempre que sea posible, y si tiene que modificar un solo valor, generalmente es mejor devolver el valor modificado como resultado de una función en lugar de pasar el valor por referencia.

Los únicos casos en los que puede necesitar pasar por referencia es cuando necesita modificar valores múltiples. Sin embargo, estos casos suelen ser raros y, por lo general, deben tratarse como una bandera para verificar su código, porque probablemente haya una forma mejor de abordar el problema.

Anteriormente, los lenguajes de programación iniciales siempre solían pasar por referencia y pasar por valor era un desarrollo posterior para abordar los problemas que esto producía (usted tiende a terminar con errores oscuros porque tarde o temprano algún programador pone el código para modificar el valor de referencia pasado por una función u otra, y luego es difícil identificar dónde y corregirlo correctamente; tiende a terminar con dependencias múltiples y desconocidas). Por lo tanto, es bastante perverso realmente considerar seriamente esto como una opción para afeitar algunos ciclos de máquina cuando somos varias generaciones de procesador más allá del punto en que se consideraba una buena compensación de la CPU versus la complejidad para ayudar a mantener limpio, mantenible, código.

11

PHP hace uso de copiar-escribir tanto como sea posible (siempre que normalmente aumentaría el rendimiento) por lo que el uso de referencias no le dará ningún beneficio de rendimiento; solo duele. Use referencias solo cuando realmente las necesite. Desde el Manual de PHP:

Haz no uso de retorno por referencia para aumentar el rendimiento. El motor automáticamente optimizará esto por sí mismo. Solo devuelva referencias cuando tenga una razón técnica válida para hacerlo.

Cuestiones relacionadas