2012-02-17 8 views
19

In PHP 5, è necessario utilizzare il modificatore & per passare per riferimento? Ad esempio,Come passi oggetti per riferimento in PHP 5?

class People() { } 
$p = new People(); 
function one($a) { $a = null; } 
function two(&$a) { $a = null;) 

in PHP4 che avete avuto bisogno il modificatore & per mantenere riferimento dopo un cambiamento era stato fatto, ma sono confuso sui temi che ho letto riguardo all'uso automatica di PHP5 di pass-by-di riferimento, ad eccezione quando si espelle clonando l'oggetto.

In PHP5, è il modificatore&necessaria per passare da riferimento per tutti i tipi di oggetti (variabili, classi, matrici, ...)?

+3

Il manuale risolverà tutti i tuoi problemi. http://php.net/manual/en/language.oop5.references.php – rdlowrey

risposta

76

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.

+11

Grazie per aver spiegato la differenza tra identificatori e riferimenti, il manuale non era molto chiaro su questo. –

+6

spiegazione molto utile e chiara! – skyfree

+0

Ecco come vengono inoltrati gli oggetti javascript per impostazione predefinita. –

0

Si sta usando male. Il segno $ è obbligatorio per qualsiasi variabile. Dovrebbe essere: http://php.net/manual/en/language.references.pass.php

function foo(&$a) 
{ 
$a=null; 
} 


foo($a); 
To return a reference, use 

function &bar($a){ 
$a=5; 
return $a 

} 

Negli oggetti e array, un riferimento all'oggetto viene copiato come parametro formale, qualsiasi operazione di parità su due oggetti è un cambio di riferimento.

$a=new People(); 
$b=$a;//equivalent to &$b=&$a roughly. That is the address of $b is the same as that of $a 

function goo($obj){ 
//$obj=$e(below) which essentially passes a reference of $e to $obj. For a basic datatype such as string, integer, bool, this would copy the value, but since equality between objects is anyways by references, this results in $obj as a reference to $e 
} 
$e=new People(); 
goo($e); 
+0

Ho dimenticato il segno "$", mi dispiace. –

+0

e ho dimenticato di leggere la domanda, mi dispiace. Vedi la mia modifica –

0

Gli oggetti passano per riferimento. I tipi incorporati saranno pass-by-value (copiati);

Ciò che accade dietro le quinte è che quando si passa una variabile che contiene un oggetto, si tratta di un riferimento all'oggetto. Quindi la variabile stessa viene copiata, ma fa ancora riferimento allo stesso oggetto. Quindi, essenzialmente ci sono due variabili, ma entrambe puntano allo stesso oggetto. Le modifiche apportate agli oggetti all'interno di una funzione permarranno.

Nel caso del codice che hai lì (prima è necessario $ anche con &):

$original = new Object(); 

one($original); //$original unaffected 
two($original); //$original will now be null 

function one($a) { $a = null; } //This one has no impact on your original variable, it will still point to the object 

function two(&$a) { $a = null;) //This one will set your original variable to null, you'll lose the reference to the object. 
+0

Quindi interi, stringhe, caratteri e booleani sono pass-by-value, a meno che non si usi il modificatore '' –

+0

@BrianGraham si. Se hai familiarità con i puntatori in C/C++ $ originale nell'esempio precedente è un po 'come quello. Tiene un indirizzo per l'oggetto che abbiamo creato. L'originale $ stesso viene copiato quando viene passato alla funzione uno ($ a), ma dal momento che contiene un indirizzo la copia punta allo stesso oggetto. – Chris

+0

Dici che in PHP5 gli oggetti vengono passati per riferimento, giusto? Allora, perché stai usando il modificatore '' per dimostrare il tuo punto se non è necessario, non mi aiuta a capire la mia domanda. –

Problemi correlati