stai invitati ad utilizzare il modificatore di & al pass-by-di riferimento?
Tecnicamente/semanticamente, la risposta è sì, , anche con gli oggetti. Questo perché ci sono due modi per passare/assegnare un oggetto: per riferimento o tramite l'identificatore . Quando una dichiarazione di funzione contiene un &
, come in:
function func(&$obj) {}
L'argomento sarà passata per riferimento, non importa quale. Se si dichiara senza il Tutto &
function func($obj) {}
sarà passato per valore, ad eccezione di oggetti e risorse, che verranno poi passata attraverso identificatore. Cos'è un identificatore? Bene, puoi considerarlo come riferimento a un riferimento. Prendiamo il seguente esempio:
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)
}
*/
Allora, perché non fa $a
diventare improvvisamente un intero dopo aver superato a makezero
? È perché abbiamo solo sovrascritto l'identificatore .Se avessimo passato per riferimento:
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
Ora $a
è un intero. Quindi, c'è una differenza tra il passaggio tramite l'identificatore e il passaggio tramite riferimento.
Il manuale risolverà tutti i tuoi problemi. http://php.net/manual/en/language.oop5.references.php – rdlowrey