2010-07-15 31 views
19

¿Qué significa el & antes del nombre de la función?¿Qué significa & antes del nombre de la función?

¿Eso significa que el $result se devuelve por referencia en lugar de por valor? En caso afirmativo, ¿es correcto? Como recuerdo, no puede devolver una referencia a una variable local ya que desaparece una vez que la función finaliza.

function &query($sql) { 
// ... 
$result = mysql_query($sql); 
return $result; 
} 

Además, ¿dónde una sintaxis como se acostumbra en la práctica ?

Respuesta

7

¿Eso significa que el $result se devuelve por referencia en lugar de por valor?

Sí.

¿Dónde se usa tal sintaxis en práctica?

Esto es más frecuente en los scripts de PHP 4 donde los objetos se transmiten por valor de forma predeterminada.

+0

-1 para indicar $ result solo existiría dentro de la función y, por lo tanto, sería inútil. – NikiC

+0

@nikic: Devolví mi respuesta. – BoltClock

+0

Bien. Así que ahora doy -1 por decir que los objetos ya no se pasan por valor en PHP 5 ... – NikiC

6

Para responder a la segunda parte de su pregunta, aquí un lugar donde tuve que usarlo: Magic getters!

class FooBar { 
    private $properties = array(); 

    public function &__get($name) { 
     return $this->properties[$name]; 
    } 

    public function __set($name, $value) { 
     $this->properties[$name] = $value; 
    } 
} 

Si no hubiera utilizado & allí, esto no sería posible:

$foobar = new FooBar; 
$foobar->subArray = array(); 
$foobar->subArray['FooBar'] = 'Hallo World!'; 

En lugar de PHP habría arrojado un error que dice algo así como 'no se puede modificar indirectamente la propiedad sobrecargada'.

Bueno, esto es probablemente solo un truco para evitar algunos maldesign en PHP, pero sigue siendo útil.

Pero, sinceramente, no puedo pensar ahora en otro ejemplo. Pero apuesto a que hay algunos casos de uso raros ...

4

¿Eso significa que el $result se devuelve por referencia en lugar de por valor?

No. La diferencia es que puede se devuelva por referencia. Por ejemplo:

<?php 
function &a(&$c) { 
    return $c; 
} 
$c = 1; 
$d = a($c); 
$d++; 
echo $c; //echoes 1, not 2! 

Para devolver por referencia Habría que hacer:

<?php 
function &a(&$c) { 
    return $c; 
} 
$c = 1; 
$d = &a($c); 
$d++; 
echo $c; //echoes 2 

también dónde una sintaxis como se acostumbra en la práctica ?

En la práctica, usted utiliza siempre que quiera que la persona que llama de su función manipule los datos que son propiedad del destinatario sin decirle. Esto rara vez se usa porque es una violación de la encapsulación: puede establecer la referencia devuelta al valor que desee; el destinatario no podrá validarlo.

nikic ofrece un excelente ejemplo de cuándo esto se utiliza en la práctica.

+0

Si la función no está definida con un & antes del nombre de la función, ¿aún puede devolver la variable con referencia en lugar de valor? –

+0

@KorayTugay no. – Artefacto

Cuestiones relacionadas