« 遅延静的束縛 (Late Static Bindings)
オブジェクトのシリアライズ »

オブジェクトと参照

PHP でのオブジェクト指向プログラミングのポイントとしてよく言われるのは 「オブジェクトはデフォルトでは参照渡しとなります」ということです。 しかし、正確には少し異なります。 この節では、いくつかの例を用いてその誤解をといていきます。

PHP の参照は一種のエイリアスで、ふたつの異なる変数に同じ値を書き込めるものです。 PHP では、オブジェクト変数の値にオブジェクト自身は含まれません。 含まれるのはオブジェクトの ID のみで、 これを用いて実際のオブジェクトにアクセスできるようになっています。 オブジェクトが引数として渡されたり戻り値となったり あるいは別の変数に代入されたりした場合、 それはエイリアスではありません。ID のコピーを保持し、 同じオブジェクトを指すようになるのです。

例1 参照とオブジェクト

<?php
class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;     // $a と $b は同じ ID を持つコピーです
             // ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";


$c = new A;
$d = &$c;    // $c と $d は参照です
             // ($c,$d) = <id>

$d->foo = 2;
echo $c->foo."\n";


$e = new A;

function foo($obj) {
    // ($obj) = ($e) = <id>
    $obj->foo = 2;
}

foo($e);
echo $e->foo."\n";

?>

上の例の出力は以下となります。

2
2
2
関連キーワード:
変数   エイリアス   コピー   遅延   束縛   Late   Static   Bindings   シリアライズ   オブジェクト指向   プログラミング   ポイント   正確   誤解   一種   自身   実際   代入   保持
関連する関数・ページ:
language.oop5.late-static-bindings   language.variables   function.is-string   language.variables.predefined   function.is-null   book.var