¿Qué significa iniciar una función PHP con un ampersand?

129

Estoy usando la biblioteca de Facebook con este código:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

¿Qué significa & al comienzo de la definición de la función y cómo hago para usar una biblioteca como esta (en un ejemplo simple)

Alex Mcp
fuente

Respuestas:

157

Un signo y antes de un nombre de función significa que la función devolverá una referencia a una variable en lugar del valor.

Volver por referencia es útil cuando desea utilizar una función para encontrar a qué variable debe vincularse una referencia. No utilice el retorno por referencia para aumentar el rendimiento. El motor optimizará esto automáticamente por sí solo. Solo devuelva referencias cuando tenga una razón técnica válida para hacerlo.

Ver Referencias recurrentes .

Dominic Rodger
fuente
1
Entonces, sin entrar en demasiados detalles, llamaría (con la clase instanciada) algo así como $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Supongo que no estoy seguro del matiz aquí, aunque gracias por la ayuda.
Alex Mcp el
2
Sí, lo llamaría así.
Dominic Rodger el
16

Está devolviendo una referencia, como ya se mencionó. En PHP 4, los objetos se asignaron por valor, como cualquier otro valor. Esto es muy poco intuitivo y contrario a cómo funciona la mayoría de los otros idiomas.

Para evitar el problema, se utilizaron referencias para variables que apuntaban a objetos. En PHP 5, las referencias se usan muy raramente. Supongo que este es un código heredado o un código que intenta preservar la compatibilidad con PHP 4.

troelskn
fuente
Es la biblioteca oficial de Facebook PHP, FWIW.
Alex Mcp el
44
@ Alex: En ese caso, probablemente lo estén haciendo para proteger a los piratas informáticos casuales, que usan php4, de ellos mismos. No debe hacer esto en su propio código: está en desuso.
troelskn el
3
"Esto es muy poco intuitivo y contrario a cómo funciona la mayoría de los otros idiomas" No podría estar más en desacuerdo.
Carreras de ligereza en órbita el
55
@WildlyInaccurate: Asignar objetos por referencia de forma predeterminada, que es lo que sucede en .NET y Java (creo), es muy poco intuitivo. En la mayoría de los otros idiomas, la asignación se realiza por copia, ya sea que tenga un "objeto" o un primitivo o lo que sea, y dado que este ha sido el caso desde el principio de los tiempos, esto es a lo que el mundo debería haberse apegado.
Carreras de ligereza en órbita el
44
Si algo es intuitivo es probablemente bastante subjetivo. Pero para lenguajes que son similares a PHP, la norma es pasar objetos por referencia. Con respecto a OOP, diría que es la forma más intuitiva, ya que OOP se trata de encapsular el estado, por lo que los programas generalmente se refieren a ese estado, en lugar de clonarlo.
troelskn
4

Esto se conoce a menudo en PHP como Referencia de retorno o Devolución por referencia .

Volver por referencia es útil cuando desea utilizar una función para encontrar a qué variable debe vincularse una referencia. No utilice el retorno por referencia para aumentar el rendimiento. El motor optimizará esto automáticamente por sí solo. Solo devuelva referencias cuando tenga una razón técnica válida para hacerlo.

Documentación de PHP sobre referencias de retorno

Una referencia en PHP es simplemente otro nombre asignado al contenido de una variable. Las referencias PHP no son como punteros en la programación en C , no son direcciones de memoria reales, por lo que no pueden usarse para la aritmética de punteros.

El concepto de devolución de referencias puede ser muy confuso, especialmente para los principiantes, por lo que un ejemplo será útil.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

La función getPopulationCount()definida con un precedente &, devuelve la referencia al contenido o valor de $populationCount. Entonces, incrementando $countryPopulation, también incrementa $populationCount.

Elisha Senoo
fuente