トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

オブジェクト指向

オブジェクト指向

[PHP]
最終更新時間:2010年05月06日 21時35分07秒

○クラス
ある概念を表現する設計図らしい。
プロパティとかメソッドをまとめて入れる箱だと思えばよいかな。

○プロパティ
クラスの中に入る変数のことかな。
以下の$nameのことなのかな(若干違うかも)。
この状態のことをFoodクラスが$nameという属性を持っているというらしい。

class Food {

 private $name;

}

※privateとかに関しては下記で説明する

○メソッド
クラスの中にある関数のこと。

class Food {

 private $name;
 public function getName() {
   return $this->name;
 }

}

○インスタンス化
クラスを実際のコードで使える用にnewとかしたもの。
以下はFoodクラスを$foodというオブジェクトにインスタンス化している。

class Food {

 private $name;
 public function getName() {
   return $this->name;
 }

}

$food = new Food;

○$this->
$this->は自身のオブジェクトを示す。
以下はFoodクラスのオブジェクトである$foodのsetNameメソッドを呼び、
setNameでは引数$nameを自身のプロパティ$nameに代入している。
ようはクラスのプロパティを$thisを使えば呼び出せるということ。

class Food {

   private $name;
 public function getName() {
   return $this->name;
 }
 
 public function setName($name) {
   $this->name = $name;
 }

}

$food = new Food;
$food->setNmae('banana');

○アクセス修飾詞
上の例でprivateとかpublicとかをアクセス修飾詞といい、プロパティやメソッドを参照できる範囲を制御する。

・private
同じクラス内からのみ参照可能

・public
どこからでも参照可能

・protected
同じクラス内、またはそのクラスを継承するクラスからのみ参照可能

○コンストラクタ
コンストラクタはインスタンス化の際に必ず呼ばれるメソッド

○継承
以下のように記述する。
class Meat extends Food {

}

※継承を禁止するには親クラスにfinalをつけて宣言する。

○オーバーライド
継承するクラスで親クラスのメソッド、プロパティを上書きするもの

子クラスで上書きを定義すれば問題なくいける

○カプセル化
例えば以下のようなプログラムがあるとする。

class Food {

 public $food;

}

このようなクラスだとプログラム側から直接$foodにアクセスできてしまうため
プログラム側に一か所変更があったらすべてを変更しなければいけなくなる。

そのため、直接はアクセスできないようにするため、
以下のように書き換える。

class Food {

 private $name;
 public function getName() {
   return $this->name;
 }

}

上記のように書けば、プログラム側からはgetNameメソッドを使えばよい為、
仮にnameに変更があったとしても楽に書き換えることができる。

プロパティは基本的に全てprivateかprotectedに設定する!!

また、読み込み用のメソッド名は、

 getプロパティ名

書き込み用のメソッド名は

 setプロパティ名

とする。
このようなメソッドをアクセサメソッドという。

○リファクタリング
リファクタリングとは、ソフトウェアの外側の挙動を変更せずに中身を変更すること。

意識して行ったほうがよいこと
・複数の機能を持つメソッド、名前と機能が一致しないメソッドは改名、分割したほうがよい

○parent
親クラスのメソッドはparentを使えば呼べる。

class Apple {

 private $taste = '甘い';
 public function getTaste() {
   return "味:", $this->taste;
 }

}

class Tsugaru extends Apple {

 public function getTaste() {
   return parent::getTaste() . "、やや酸っぱい";
 }

}

$hoge = new Tsugaru;
echo $hoge->getTaste();

# 味:甘い、やや酸っぱい

○クラス定数
普通の定数は

 define('CONST', '')

で定義する。

クラスの定数はプロパティにconstをつけて定義する。
呼び出す際はクラス名::プロパティ名で呼び出す。

○static
staticで宣言されたプロパティとメソッドはクラスをインスタンス化しなくても呼び出すことができる。

class Food {

 private static $name = "食べ物";
 public static function getName() {
   return self::$name;
 }

}

echo Food::$name # $nameがprivateなためエラーがでてるのかな。
echo Food::getName() # "食べ物"

○抽象クラス
抽象クラスとは直接インスタンスを生成できないクラスのこと。
つまり必ず継承して使用するクラス。

・抽象クラスには抽象メソッドを定義することができる。

・抽象メソッドとは処理内容を持たずに名前だけ定義されたメソッドのこと。
 抽象メソッドは継承先のクラスで必ずオーバーライドする必要がある。
 そうしないとエラーになる。

・抽象クラスには抽象メソッドを定義しなくてもいいみたい。

○インターフェース
プログラマがある日勝手にクラスからメソッドなどを削除してしまわないように
クラスにある程度の条件を設けるもの。

このクラスにはこのメソッドの記述が必ず必要だみたいな機能らしい。
 ⇒インターフェースを実装するクラスは、そのinterfaceのメソッドに対する実相を必ず実装しなければならない

抽象メソッドのみ定義可能なクラスみたいなもんらしい。
⇒抽象クラスでは普通のメソッドも定義できたけど、インターフェイスでは抽象メソッドしか定義できない。

【特徴】
・定義できるのは抽象メソッドのみ
・抽象メソッドだけどabstractはいらない
・アクセス修飾子にはpublicしか指定できない
・直接インスタンスの生成はできない

参考

http://phpc2.seesaa.net/article/50625577.html
http://www.objective-php.net/basic/about