PHP クラス __toString,__cloneメソッド,echoについて
クラス
前回に引き続いて今回もクラスについて記載していきたいと思います。
__toStringメソッド
__toStringメソッドは生成したオブジェクトを、echo や print などの引数に渡した場合に
実行されるクラス内の特殊なメソッドです。
__toStringメソッドの実行例
以下では生成したオブジェクトを echo の引数に渡して __toStringメソッド内の処理を実行しています。
<?php class test{ public function __toString(){ return "12345"; } } $obj = new test; echo $obj; ?>
この __toStringメソッド内で returnの引数に渡したものが、echo オブジェクト名; で表示されることになります。
そのため以下のように return で戻り値を渡すことを忘れるとエラーになってしまいます。
<?php class test{ public function __toString(){ echo "__toString内のメッセージ"; } } $obj = new test; echo $obj; ?>
オブジェクトのコピー
クラスではオブジェクトの内容をコピーすることができます。
コピーした場合、コピー元のオブジェクトとコピー先のオブジェクトは同じ位置を参照することになります。
なのでコピー元のプロパティを変更したりすると、コピー先のオブジェクトも影響を受けることになります。
オブジェクトのコピー方法
オブジェクトをコピーする際は以下のようにするだけです。
$コピー先オブジェクト = $コピー元オブジェクト;
以下ではオブジェクトをコピーしてコピー先のオブジェクトからプロパティを表示しています。
<?php class test{ public $atai = 10; } $obj1 = new test; $obj2 = $obj1; echo $obj2->atai; ?>
コピー元のオブジェクトとは同じ位置を参照しているので、
以下のようにコピー元でプロパティの値を変更するとコピー先のオブジェクトを参照した際にも値が影響を受けています。
<?php class test{ public $atai = 10; } $obj1 = new test; $obj2 = $obj1; $obj1->atai = 200; echo $obj2->atai; ?>
オブジェクトのクローン
コピーでは同じコピー元のオブジェクトと同じ位置を参照しているので、コピー元のオブジェクトのプロパティを変更したりすると、
コピー先のオブジェクトのプロパティも変更されてしまいます。
クラスではオブジェクトの複製などをしたい場合に clone を使用することができます。
作成したクローンはクローン元のオブジェクトと別の場所を参照することになるので、
クローン元のオブジェクトのプロパティを変更しても影響を受けません。
クローンの生成方法
オブジェクトのクローンを作成する場合は以下のようにします。
$オブジェクト名 = new クラス名; $クローンオブジェクト名 = clone $オブジェクト名;
以下ではオブジェクトを生成してから、そのクローンを作成してメソッドを実行しています。
<?php class test{ public function func(){ echo "clone を作成"; } } $obj1 = new test; $obj2 = clone $obj1; $obj2->func(); ?>
以下では作成したクローンからメソッドを実行してプロパティの値を変更しています。
<?php class test{ public $atai = 100; public function func(){ $this->atai = 2000; } } $obj1 = new test; $obj2 = clone $obj1; $obj2->func(); echo "$obj1->atai<br>"; echo "$obj2->atai<br>"; ?>
クローンの場合はコピーと違い影響を受けないことが分かります。
__cloneメソッド
クラス内に __cloneメソッドを記述すると、オブジェクトのクローンを生成した際に
実行する処理を記述することができます。
__cloneメソッドの実行方法
以下ではクローンを作成し __cloneメソッド内の処理を実行しています。
<?php class test{ public function __clone(){ echo "__clone内の処理"; } } $obj1 = new test; $obj2 = clone $obj1; ?>
結果は __cloneメソッド内の処理が実行されていることが分かります。
今回はここまでで次回もクラスについて記述していきたいと思います。