カプセル化の典型として、プロパティの隠蔽と、アクセサメソッドに触れてみます。
まずは、三角形の面積を求めるTriangleFigureクラスを作ってください。(ファイルも忘れずに)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class TriangleFigure{ //プロパティ public $bases; public $heigth; //コンストラクタ public function __construct(){ $this -> bases = 1; $this -> heigth = 1; } //メソッド public function getArea(){ return $this -> bases * $this -> heigth /2; } } |
次にこれを実行するときに、下記のように負の数や文字列を与えて見ましょう。
|
require_once "./classes/TriangleFigure.php"; $tri = new TriangleFigure(); $tri -> bases = -10; $tri -> height = 'hanohano'; print '三角形の面積は'.$tri -> getArea()."平方センチメートルです。"; |
実際に使うためにはこのような結果を出されるとこまってしまいますね。
このように必要とする値がわたったときにチェックする場合、いろいろな方法が考えられると思いますが、カプセル化を行い、アクセス制限をうまく利用する方法がクラス~オブジェクト指向では定番となります。 では実際に行ってみましょう。
まずは、プロパティをprvate権限に変更します。
|
private $bases; private $heigth; |
コンストラクタとメソッドの間に下記のように、各プロパティのゲッタ、セッタメソッドを準備します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
//basesプロパティのゲッタ public function getBases(){ return $this -> bases; } //basesプロパティのセッタ public function setBases($bases){ if(is_numeric($bases) && $bases > 0){ $this -> bases = $bases; } } //heigthプロパティのゲッタ public function getHeigth(){ return $this -> heigth; } //heigthプロパティのセッタ public function setHeight($heigth){ if(is_numeric($heigth) && $heigth > 0){ $this -> heigth =$heigth; } } |
各セッタメソッドで数字で且つ正の数であることのチェックをしています。
- ゲッタメソッド(get****(){}) プロパティ値を取得するメソッド
- セッタメソッド(set****(){}) プロパティ値に設定するメソッド
メソッド内の処理を下記のように書き換えてください。
|
return $this -> getBases() * $this -> getHeigth() /2; |
実行時のコードを下記のように書き換えてください。
|
$tri -> setBases(-10); $tri -> setHeight("aa"); |
こうすることによって、プロパティを外部からは隠蔽化しておき、一旦セッタメソッドでチェックし、プロパティ値を設定。ゲッタメソッドで値を取得し、期待する値をしっかりと計算することができましたね。