クラスの定義とインスタンス化
PHPでクラスを定義する時はclassキーワードを使って「class クラス名 { プロパティとかメソッドとか・・・ }」という感じ
定義したクラスをインスタンス化する時も「$変数名 = new クラス名(パラメータ);」という感じで、他の言語でもよくあるパターン
インスタンスのプロパティへ参照は「$変数名->プロパティ名」、メソッドは「$変数名->メソッド名(引数)」で実行出来る。
小クラスへの継承
一般的な言語と同様に小クラスへ継承する機能も完備^^。書式は「class 子クラス名 extends 親クラス名 { 小クラスのプロパティとかメソッドとか・・・ }」
// クラスの定義(親)
class ClsSampleDog{
//プロパティ
public $br = "<br />";
protected $name ;
//コンストラクタ
function __construct($name){
$this->name = $name;
}
// アクセサメソッド(Get)
function getName(){
return $this->name;
}
// アクセサメソッド(Set)
function setName($name){
$this->name = $name;
}
// メソッド
public function myName(){
return "My name is " . $this->getName();
}
// メソッド
public function bow(){
return "bow bow ";
}
}
// 子クラスの定義(継承)
class ClsChildSampleDog extends ClsSampleDog{
public function myName() {
return "My name is " . $this->getName();
}
}
// それぞれのクラスをインスタンス化
$sampleParent = new ClsSampleDog("Lucky"); // 親クラス
$sampleChild = new ClsChildSampleDog("Happy"); // 子クラス
// 親クラスのメソッドやプロパティ
echo $sampleParent->myName(); // Lucky
echo $sampleParent->br; // <br />
echo $sampleParent->bow(); // bow bow
echo $sampleParent->br; // <br />
$sampleParent->setName("Lassie"); // $nameを上書き
echo $sampleParent->myName(); // Lassie
echo $sampleParent->br; // <br />
// 子クラスのメソッドを実行
echo $sampleChild->myName(); // Happy
echo $sampleParent->br; // <br /> (親子クラスのプロパティより)
echo $sampleChild->bow(); // bow bow (親クラスのメソッドより)
echo $sampleParent->br; // <br /> (親子クラスのプロパティより)
新規開発のプログラムで使うことは少ないけれど、既存箇所に影響なく機能追加とかするときに継承を利用すると安心でかつ便利^^
配列でカプセル化したプロパティへのアクセスを便利に
クラスのプロパティをpublicにせずprivateとかでカプセル化する事でプロパティの思わぬ書き換えとか誤った値がセットされるトラブルを避ける意味がある。
その代わり、カプセル化したプロパティにアクセスするにはset~とかget~といったアクセサメソッドが必要になる訳だけど、数が多くなるとこのアクセサメソッドが大量に増えるのが何とも面倒^^;
折衷案として、privateな配列を用意して配列のキーと値を渡すsetメソッドとか使うと便利だったりします。キー項目に応じて値をチェックしたりという事も可能だし、違うキー項目でも同じチェック内容ならば一つにまとめられるので^^
class ClsSampleVar{
// privateの配列でプロパティを定義
private $var = [];
public $br = "<br />";
// アクセサメソッド(set)
public function setVar($key,$value){
// 配列にkeyと値をセット
$this->var[$key] = $value;
}
// アクセサメソッド(Get)
public function getVar($key,$default=null){
// 配列に該当のKeyがあるかをチェック
if(array_key_exists($key,$this->var)){
// Keyがあればその値を返す
return $this->var[$key];
} else {
// Keyがなければ初期値を返す
return $default;
}
}
}
$var = new ClsSampleVar(); // インスタンス化
$var->setVar("apple",100); // 配列にKeyと値をセット(apple)
$var->setVar("melon",200); // 配列にKeyと値をセット(melon)
echo $var->getVar("apple"); // 100(配列からappleの値を取得)
echo $var->br; // <br />
echo $var->getVar("melon",1234); // 200(配列からmelonの値を取得)
echo $var->br; // <br />
echo $var->getVar("mikan","???"); // ???(Keyが存在しないので初期値が戻る)
echo $var->br; // <br />