PHP 5の対象割当メカニズムの紹介


 
<?php
class SimpleClass{
public $var = 'a default value';
public function displayVar() {
echo $this->var;
}
}
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned will have this value';
$instance = null; // $instance and $reference become null var_dump($instance);var_dump($reference);var_dump($assigned);
var_dump($instance);
var_dump($assigned);
var_dump($reference);
?>
php 5はOOP下層を書き換えた。クラスが一例(オブジェクト)を生成すると、リターン値は$instance自体ではなく、オブジェクトの一つのid(またはリソースハンドル)にすぎないので、$instanceが$assignedに割り当てられたときには、$assignedもこのオブジェクトを指しています。したがって、$instanceを初期化すると、$assignedも初期化されます。ただし、$instanceが破壊された場合(=null)、対応するオブジェクトにはもう一つのハンドルが存在しますので、オブジェクトは破壊されず、コンストラクタもトリガされません。結局、var_dump($assigned)は対象の値ですが、instanceはすでに空のハンドルです。nullを表示します。referenceは$instanceと同じような変数間の引用関係があるため、空のハンドルとなり、nullを表示します。