PHP __toString,__cloneメソッド,echo 【初級編 第45回】

この記事は2013年1月16日に書かれたものです。内容が古い可能性がありますのでご注意ください。


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メソッド内の処理が実行されていることが分かります。
ブラウザ確認画像

今回はここまでで次回もクラスについて記述していきたいと思います。

  • このエントリーをはてなブックマークに追加

PAGE TOP