web-dev-qa-db-ja.com

PHP 5で参照によりオブジェクトをどのように渡しますか?

PHP 5では、参照渡しするために&修飾子を使用する必要がありますか?たとえば、

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

PHP4では、変更が加えられた後も参照を維持するために&修飾子が必要でしたが、オブジェクトを明示的に複製する場合を除いて、PHP5の参照渡しの自動使用に関して読んだトピックに混乱します。

PHP5では、&修飾子は、すべてのタイプのオブジェクト(変数、クラス、配列、...)?

23
Brian Graham

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

技術的/意味論的には、オブジェクトがあってもyesです。これは、オブジェクトを渡す/割り当てる方法が2つあるためです。参照による方法とidentifierによる方法です。次のように、関数宣言に&が含まれている場合:

function func(&$obj) {}

引数は、何があっても参照によって渡されます。 &なしで宣言した場合

function func($obj) {}

identifierを介して渡されるオブジェクトとリソースを除いて、すべてが値によって渡されます。識別子とは何ですか?まあ、あなたはそれをリファレンスへのリファレンスと考えることができます。次の例を見てください。

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

*/

では、なぜmakezeroに渡した後、$aが突然整数にならないのですか? identifierのみを上書きしたためです。 referenceを渡した場合:

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

makezero($a);

var_dump($a);

/* 
output:

int(0) 

*/

現在、$aは整数です。したがって、identifierを介した受け渡しとreferenceを介した受け渡しには違いがあります。

87
webbiedave

あなたはそれを間違って使用しています。 $記号は、すべての変数で必須です。 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

 }

オブジェクトと配列では、オブジェクトへの参照が仮パラメータとしてコピーされます。2つのオブジェクトに対するすべての等価演算は参照交換です。

$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
SoWhat

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

背後で起こっていることは、オブジェクトを保持する変数を渡すとき、それはオブジェクトへの参照であるということです。したがって、変数自体はコピーされますが、それでも同じオブジェクトを参照します。したがって、基本的に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
Chris