Fácil regla: si pasa &
delante de un nombre de función en PHP puede utilizar &
cuando se llama a la función (. Es decir, su valor de retorno) como si fuera una variable y no una función.
Eso es todo.
Es más fácil pensar en él como "PHP que le permite hacer referencia al valor de retorno" en lugar de PHP retorno por referencia. Como se mencionó anteriormente, simplemente coloque un &
para decirle a PHP que quiere esto, si no lo coloca y trata de hacerlo a $var =& somefunction()
obtendrá el error "Las variables solo se deben asignar por referencia".
Para aclarar un poco la confusión con la respuesta de Jon. En realidad, no es necesario tener dos funciones separadas, una que retorna por referencia y otra que retorna por valor; fuera de alguna convención de proyecto. El &
solo le permite devolver por referencia, no lo hace forzarlo para devolverlo por referencia.
por ejemplo. misma función utilizada tanto para las asignaciones de referencia y no son de referencia
\header('content-type: text/plain');
class Demo
{
protected $example = 'original value';
function & example()
{
return $this->example;
}
}
$demo = new Demo;
#1 - pass by value
$var1 = $demo->example();
$var1 = 'var1 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo PHP_EOL;
#2 - pass by reference
$var2 =& $demo->example();
$var2 = 'var2 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo PHP_EOL;
#3 - altering other references
$var3 =& $demo->example();
$var3 = 'var3 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo '$var3 => '.$var3.PHP_EOL;
echo PHP_EOL;
exit;
salida
$demo->example() => original value
$demo->example() => var2 value
$var1 => var1 value
$var2 => var2 value
$demo->example() => var3 value
$var1 => var1 value
$var2 => var3 value
$var3 => var3 value
Las referencias son grandes sin embargo, si usted no está familiarizado con ellos por favor, siga las siguientes reglas:
- solo considere usar referencias si está tratando con una matriz grande o estructuras de datos no objeto similares
- Nunca haga referencia a un objeto (si puede evitarlo)
- solo permiten que una función pase por referencia si el valor se mantiene en una propiedad estática o atributo en el objeto (es decir. no es una variable temporal dentro de la función)
Las excepciones obviamente serían usos muy utilitarios (es decir, cuando realmente desea compartir un valor para simplificar el código para manipularlo).
Una vez más, NUNCA hacer referencia a objetos (que no tiene sentido!)
Los documentos [PHP] (http://php.net/manual/en/language.references.return.php) es la respuesta definitiva a esto - asegúrese de examinar toda la sección de "explicaciones explicadas". – Jon
Cmon Jon, he dicho que ya he pasado por la documentación, y para admitir que no lo entendí bastante bien desde allí. esa es la razón por la que estoy preguntando aquí, agradecería si tiene alguna de su versión para explicar :) –
El enlace proporcionado por Jon lo explica bien con el ejemplo. – xdazz