2012-02-17 12 views
19

PHP 5では、参照渡しのために修飾子&を使用する必要がありますか?例えば、PHP4でPHP 5でどのようにオブジェクトを参照渡ししますか?

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

あなたは変更が行われた後の参照を維持するために&修飾子を必要ですが、私は参照渡しのPHP5の自動使用に関して読んだことが話題に困惑している、除きます明示的にオブジェクトをクローンします。 PHP5で

は、オブジェクトのすべてのタイプ(変数、クラス、配列、...)のために参照により渡す必要&修飾子は?

+3

マニュアルはすべての問題を解決します。 http://php.net/manual/en/language.oop5.references.php – rdlowrey

答えて

76

あなたは参照渡しする&修飾子を使用する必要がありますか?

技術的にも意味的にも、オブジェクトの場合でも、はいとなります。これは、オブジェクトを渡したり割り当てたりする2通りの方法があります。参照または識別子によって行われます。関数宣言は&が含まれている場合は、のように:

function func(&$obj) {} 

引数は、どんな参照によって渡されません。あなたは&

function func($obj) {} 

すべてずに宣言した場合、識別子を経由して渡されるオブジェクトとリソースを除いて、値によって渡されます。識別子は何ですか?さて、あなたはそれをリファレンスへのリファレンスと考えることができます。以下の例を見てみましょう:

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) 
} 

*/ 

なぜない$aが突然makezeroにそれを通過した後、整数になるのでしょうか?これは、という識別子がに上書きされたためです。我々は参照によって渡されていた場合:今

function makezero(&$obj) 
{ 
    $obj = 0; 
} 

makezero($a); 

var_dump($a); 

/* 
output: 

int(0) 

*/ 

$a整数です。したがって、の識別子を通過し、の参照を経由することには違いがあります。

+11

識別子と参照の違いを説明していただきありがとうございます。 –

+6

非常に有用で明確な説明! – skyfree

+0

これは、javascriptオブジェクトがデフォルトで渡される方法です。 –

0

これは間違っています。 $記号は、任意の変数に対して必須です。それがあるべき:オブジェクトと配列において 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 

} 

は、オブジェクトへの参照は、仮パラメータとしてコピーされ、二つのオブジェクト上の任意の等価操作が参照交換があります。

$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

「$」記号を忘れました。申し訳ありません。 –

+0

と私は、ごめんなさい、ご質問をお読みください。私の編集を参照してください –

0

オブジェクトは参照渡しになります。組み込み型は、値渡し(コピー)されます。

舞台裏で起こっていることは、オブジェクトを保持する変数を渡すと、そのオブジェクトへの参照であるということです。したがって、変数自体はコピーされますが、引き続き同じオブジェクトを参照します。したがって、本質的に2つの変数がありますが、両方とも同じオブジェクトを指しています。関数内でオブジェクトに加えられた変更はそのまま残ります。あなたは(最初にあなたも&と$を必要とする)が持っているコードの場合は

$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

'&'修飾子を使用しない限り、整数、文字列、文字およびブール値は値渡しですか? –

+0

@BrianGrahamはい。 C/C++のポインタに慣れていれば、前の例の$ originalはそんなものです。私たちが作成したObjectへのアドレスを保持します。 $ original自体は関数1($ a)に渡されるとコピーされますが、アドレスを保持しているのでコピーは同じObjectを指しています。 – Chris

+0

あなたは、PHP5のオブジェクトが参照渡しされていると言うでしょうか?なぜあなたのポイントが必要でないかを証明するために '&'修飾子を使用しているのですが、私の質問を理解する助けにはなりません。 –

関連する問題