PHPなオブジェクト指向入門 vol.2

アクセサメソッドについてのサンプルソース。(言葉で説明すると冗長なためサンプルソースということで)

フォーム(form.html)で身長と体重を入力してもらい、check.phpで肥満度を表示するサンプル。

form.html

<html>
<head><title>肥満度チェック</title></head>
<body>
<p>身長と体重を入力してください。</p>
<form action="check.php" method="post"><!-- check.phpに値を受け渡す -->
身長:<input type="text" name="height"> [m]<br>
体重:<input type="text" name="weight"> [kg]<br>
<input type="submit" value="肥満度をチェック">
</form>
</body>
</html>


check.php
$obj_BMI->tall = $_POST['height']; といったように直接セットしないでメソッド(アクセサメソッド)を用いて値をセットすることがポイント!これにより、不正な値をセットしてしまうことを防止します。

<?php
// CheckBMIクラスの使用例
include('CheckBMI.class.php'); //ロジック(モデル)は別ファイル化するとスッキリします。
$obj_BMI = new CheckBMI();
$obj_BMI->SetTall($_POST['height']);
$obj_BMI->SetWeight($_POST['weight']);
if($obj_BMI->IsError() === FALSE){ //ERRORなし
	$BMI = $obj_BMI->GetBMI();
	echo "身長{$_POST['height']}メートル、体重{$_POST['weight']}キログラム。";
	echo "そんなあなたの肥満度(BMI)は{$BMI}です。";
}else{
	$array_error = $obj_BMI->IsError();
	foreach($array_error as $item){
		echo "<p>{$item}</p>";
	}
	echo '<p><a href="form.html">戻って再入力</a></p>';
}
?>


CheckBMI.class.php

<?php
// CheckBMIクラス
class CheckBMI{

	var $tall;
	var $weight;
	var $BMI;
	var $array_error; // 各種エラーを格納する配列

	function CheckBMI(){ //コンストラクタ(プロパティの初期化)
		$this->tall   = 1;
		$this->weight = 1;
		$this->BMI    = 1;
		$this->array_error  = array();
	}

	function SetTall($tall){
		if(is_numeric($tall)){
			if($tall > 0 && $tall < 3){ // 0m 〜 3m なら人間でしょう。
				$this->tall = $tall; // 引数$tallをプロパティ(メンバ変数)にセット
			}else{
				$this->array_error[] = "身長の単位はメートルです。センチメートルではありません。"; // エラー配列に格納
			}
		}else{
			$this->array_error[] = "身長には数値を入力してください。";
		}
	}

	function SetWeight($weight){
		if(is_numeric($weight)){
			if($weight > 5 && $weight < 300){ // 5kg 〜 300kg なら人間でしょう。
				$this->weight = $weight; // 引数$tallをプロパティ(メンバ変数)にセット
			}else{
				$this->array_error[] = "体重の単位はキログラムです。";
			}
		}else{
			$this->array_error[] = "体重には数値を入力してください。";
		}
	}

	function CalculateBMI(){
		$this->BMI = $this->weight / ($this->tall * $this->tall);
	}
	
	function GetBMI(){
		$this->CalculateBMI();
		$BMI = round($this->BMI, 3);
		return $BMI;
	}

	// エラーがあるならTRUEを返すメソッド
	function IsError(){
		if(count($this->array_error) > 0){ //何かしらのエラーがセットされている
			return $this->array_error;
		}else{
			return FALSE;
		}
	}
}
?>

※あくまでアクセサメソッド解説用サンプルです。異常に冗長だったり、HTMLがいい加減だったりと、実用には耐えうるレベルのソースではありませんので、そこのところはご了承ください。

※アクセサメソッドは本来カプセル化と密接な関わりのあるものですが、PHP4ではオブジェクト指向の実装が中途半端であり、カプセル化という概念が導入されていません。(PHP5では導入されています。)