PHP クラスのオブジェクトの比較とタイプヒンティング 【初級編 第52回】

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


PHP

クラス

前回に引き続いて今回もクラスについて記述していきたいと思います。

クラスのオブジェクトの比較

クラスのオブジェクト同士をif文などで比較すると
そのオブジェクトが同じクラスから作成されたのか、別のクラスから作成されたのかなどによって結果が変わってきます。

オブジェクトの比較をしてみる

以下では testa というクラスと testb というクラスを作成して、
同一クラスから作成したオブジェクトだとどうなるか、異なるクラスから作成したオブジェクトの場合はどうなるかを比較しています。


<?php

	class testa {
		public $a;
	}

	class testb {
		public $a;
	}

	function class_diff($obj1, $obj2){

			echo "$obj1 ==  $obj2 :";
					if($obj1 == $obj2){
						echo "True.<br />";
					} else {
						echo "False<br />";
					}
			echo "$obj1 !=  $obj2 :";
					if($obj1 != $obj2){
						echo "True.<br />";
					} else {
						echo "False<br />";
					}
			echo "$obj1 === $obj2 :";
					if($obj1 === $obj2){
						echo "True.<br />";
					} else {
						echo "False<br />";
					}
			echo "$obj1 !== $obj2 :";
					if($obj1 !== $obj2){
						echo "True.<br />";
					} else {
						echo "False<br />";
					}
	}

	$testa1 = new testa();
	$testa2 = $testa1;
	$testa3 = new testa();
	$testb1 = new testb();


	echo "------ testa1, testa1 ------<br />";
	class_diff($testa1, $testa1);

	echo "------ testa1, testa2 ------<br />";
	class_diff($testa1, $testa2);

	echo "------ testa1, testa3 ------<br />";
	class_diff($testa1, $testa3);

	echo "------ testa1, testb1 ------<br />";
	class_diff($testa1, $testb1);

?>

結果は以下のようになりました。
ブラウザ確認画像

この結果からわかるように == を用いて比較した際には、
同じクラスから作成したオブジェクトであれば True になります。

また === を用いて比較した際には
同じクラスから作成したオブジェクトでかつ同じインスタンスを参照している場合にのみ True になります。

タイプヒンティング

クラスではタイプヒンティングというものを使用して、
メンバメソッドなどで受け取る引数のクラスなどを指定することができる。

指定されていないクラスなどを引数で受け取るとエラーメッセージを表示する。

<?php
	class test01 {
		public function type_test(test02 $testobj){  //test02クラスのオブジェクトのみ受け取るように指定する
			echo $testobj->var;
		}
	}

	class test02 {
		public $var = 100;
	}

	$test01obj = new test01();
	$test02obj = new test02();
	$test03obj = new test03();
	$test01obj->type_test($test02obj);

?>

この場合は以下のように実行は成功する
ブラウザ確認画像

だが以下のように指定していないクラスのオブジェクトを渡そうとするとエラーになる

<?php
	class test01 {
		public function type_test(test02 $testobj){  //test02のクラスのオブジェクトのみ受け取るように指定する
			echo $testobj->var;
		}
	}

	class test02 {
		public $var = 100;
	}

	class test03 {
		public $var = 200;
	}

	$test01obj = new test01();
	$test02obj = new test02();
	$test03obj = new test03();
	$test01obj->type_test($test02obj);
	$test01obj->type_test($test03obj);  //ここで指定していないオブジェクトを引数で渡してみる

?>

結果は以下のようになります。
ブラウザ確認画像


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

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

PAGE TOP