PHP クラスのオートロードと反復処理 【初級編 第51回】

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


クラス

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

クラスのオートロード

複数のクラスの内容を記述したファイルを別ファイルなどにしていた場合に、
それらのファイルを1つ1つ読み込むのは大変です。
そのためクラスの内容を記述したファイルを読み込むためのオートロードという機能があります。

これを使えばクラス名と同じファイル名の中に、クラスを定義しておけば実行時に読み込んでくれるようになります。

記述の仕方

以下のように __autoload という function を定義します。
そしてクラスの内容は定義しないファイルを用意します。


autoload.php

<?php
	function __autoload($classname){
		include $classname.'.php';
	}
	$obj = new class01();
	$obj->message();
?>

それから以下のようにクラスの中身を記述したファイルを用意します。
ここでは呼び出すクラス名と同じファイル名にする必要があります。

class01.php

<?php
	class class01{
		public function message(){
			echo "class01.php内の処理です。";
		}
	}
?>

この状態で autoload.php を実行すると、
class01.php の中に記述したメソッドの中身を実行できます。
結果は以下のようになります。
ブラウザ確認画像

クラスのオブジェクトの反復処理

クラスのオブジェクト内で使用しているメンバ変数は foreach を使った反復処理で
取り出すことができます。

取り出し方

以下のようにするとそのクラス内で定義されているメンバ変数のキー名と値を取り出すことができます。

<?php
	class test {
		public	$a = "atai01";
		public	$b = "atai02";
		public	$c = "atai03";

		function hanpuku() {
			foreach($this as $key => $value){
					echo "$key は".$key."で $value は".$value."です。<br>";
			}
		}
	}

	$obj = new test();
	$obj->hanpuku();

?>

結果は以下のようになります。

ブラウザ確認画像

アクセス修飾子によってオブジェクトの反復処理で取り出せる範囲の違い

クラスの中で $this を使用して foreach した場合と クラスの外で foreach した場合では
取り出せる範囲はメンバ変数のアクセス修飾子で異なってきます。
以下は2つの public, protected, private をそれぞれクラスの中から foreach した場合と クラスの外から foreach した場合の比較です。

<?php

class test {

	public	$a = "atai01";
	protected $b = "atai02";
	private $c = "atai03";

	function hanpuku() {
		foreach($this as $key => $value){
			echo "$key は".$key."で $value は".$value."です。<br>";
		}
	}
}


$obj = new test();

echo "============= クラスの中で foreachした場合 ===============<br>";
$obj->hanpuku();

echo "============= クラスの外で foreachした場合 ===============<br>";
foreach($obj as $key => $value){
	echo "$key は".$key."で $value は".$value."です。<br>";
}

?>

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

このように public はクラスの外からでも参照することができますが、
private と protected を使用した場合はそのクラスの中、もしくは派生クラスの中からしか参照ができないので、クラス外から foreach を使用しても参照ができません。

今回はここまでにします。

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

PAGE TOP