PHP4ではprivateや__constructといったオブジェクト指向的書き方に必要な要素が使えないので、今回からの内容はPHP5以上の話となります。
クラスを使って何が便利かというと、クラス内の関数でデータを共有できる点です。
普通にサブルーチンとして関数を使用した場合、必要なパラメータをすべて引数として渡さなければなりません。
その点、クラスの場合は一旦適当なsetParameterを呼び出せば、プログラム終了までその値を持ち続けてくれます。
HTTPの限界上、さすがにリロードされたりすると消えてしまいますが、使いこなせば非常に便利です。
はっきり言ってデータと手続きの一体化とか、ポリモフィズムとか、上に比べるとどうでもいい話です。
どうせ規模が大きくなったらまたわからなくなりますし。
とりあえず図形の面積を求めるクラスを作ってみましょう。
area.php
class Area{ //変数宣言 private $base=0; private $height=0; //セッター public function setBase($base){ $base=$base+0; $this->base=$base; } public function setHeight($height){ $height=$height+0; $this->height=$height; } //ゲッター public function getTriangle(){ return $this->base*$this->height/2; } public function getQuadrangle(){ return $this->base*$this->height; } public function getOval(){ return $this->base*$this->height*M_PI/4; } } |
まず変数宣言部分で、クラス内で共通して使う変数を定義します。
privateをつけると、クラス外からその値を直接参照することが出来なくなります。
セッターメソッドは、クラス内変数に値を設定するメソッドです。
上記のようにprivate変数はクラス外から変更することが出来ないため、setBase等のpublic関数を通じて行わなければなりません。
引数として渡される値は数値を想定していますが、必ず数値が渡されるとは限りません。
うっかり、あるいは故意に文字列やスクリプトが渡されるかもしれません。
それを防ぐためにバリデートが必須となります。
今回は手っ取り早く+0とすることで数値化しています。
PHPのデータ型の扱いは極めてアバウトなので、文字列だろうがなんだろうが+0すると数値にしてくれます。
まあ配列やオブジェクトが来ると死にますが、今回はそこまでやっていません。
ゲッターメソッドは、クラスから値を受け取るメソッドです。
クラス内のprivate変数の値を参照したい場合など、このメソッドを通じて値の引取りを行います。
このクラスを呼び出す側で、
$area=new Area();としてインスタンス化し、
$area->setBase(10);$area->setHeight(20);
としてクラス内の変数$baseと$heightに値をセットしてあげます。
その後はいつでも$area->getTriangle()や$area->getOval()で値を取り出すことが出来るようになります。
値を変更したくなったら再度$area->setBase(50);等としてやればいいです。
index.php
include_once('area.php'); //インスタンス化 $area=new Area(); //セッター $area->setBase(10); $area->setHeight(20); //ゲッター print($area->getTriangle().'<br />'); print($area->getQuadrangle().'<br />'); print($area->getOval().'<br />'); //値を変化させてみる $area->setBase(50); print($area->getTriangle().'<br />'); |
以上のクラスで行ったことを、関数で行うと以下のようになります。
index2.php
$Base=10; |
量的には関数のほうが少なくてすみますが、呼び出す側では毎回getTriangle($base,$height)というふうに引数を入れてやらなければならなかったり、関数毎に引数のチェックをしたりしなければならなかったりと手間がかかります。
ただまあ、タイトルに反していますが、これが実用的なクラスかといわれると断じて否と言えます。
面積程度のことならば直接書いたほうがよっぽど早いですし。
次回はもう一歩だけ実用に近づいていくとしましょう。