que están obligados a utilizar el modificador & pasar por referencia?
Técnicamente/semánticamente, la respuesta es sí , incluso con objetos. Esto se debe a que hay dos maneras de pasar/asignar un objeto: por referencia o por identificador. Cuando una declaración de función contiene un &
, como en:
function func(&$obj) {}
El argumento se pasa por referencia, no importa qué. Si se declara sin el Todo &
function func($obj) {}
se pasa por valor, con la excepción de los objetos y recursos, que luego se pasó a través de identificador. ¿Qué es un identificador? Bueno, puedes pensar que es una referencia a una referencia. Tomemos el siguiente ejemplo:
class A
{
public $v = 1;
}
function change($obj)
{
$obj->v = 2;
}
function makezero($obj)
{
$obj = 0;
}
$a = new A();
change($a);
var_dump($a);
/*
output:
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
makezero($a);
var_dump($a);
/*
output (same as before):
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
Entonces, ¿por qué no $a
convertido de repente en un entero después de pasarlo a makezero
? Es porque solo sobrescribimos el identificador .Si hubiéramos pasado por referencia :
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
Ahora $a
es un entero. Entonces, hay una diferencia entre pasar a través del identificador y pasar por referencia.
El manual resolverá todos sus problemas. http://php.net/manual/en/language.oop5.references.php – rdlowrey