クラス、オブジェクトとは
クラス、オブジェクトとは、データ(変数)とデータを処理する手続き(関数)をひとまとめにしたものです。
| データ | 処理 | |
|---|---|---|
| 変数 | 保持 | × |
| 関数 | × | する |
| クラス/オブジェクト | 保持 | する |
クラスとオブジェクト
クラスは設計図、オブジェクトは設計図であるクラスをもとに作られたもの、ということができます。同一のクラスは1つしか存在しませんが、 1つのクラスをもとに複数のオブジェクトを生成できます。
インスタンス化
クラスからオブジェクトを生成することをインスタンス化といいます。
$obj = new SampleClass();
インスタンス化したオブジェクトは、 上記のサンプルコードの場合は変数$objに格納されます。$objはオブジェクト変数と呼ばれる場合があります。
メソッドとプロパティ
クラスに属する関数と変数のことを、それぞれメソッドとプロパティと呼びます。
メソッドは次のように呼び出します。
[$val=] $obj -> メソッド名();
プロパティは次のように呼び出します。
$obj -> プロパティ名 [=値];
クラスを定義する
クラスはclass命令によって定義します。クラス名の頭文字は通常大文字にします。 また、クラスは1つのクラスに対して1つのファイルというのが通例です。ファイル名は 「(クラス名).class.php」のようにすることが多いようです。
サンプル
次のサンプルは、長方形の面積を求めるクラスです。
class GetArea {
public $width;
public $height;
public function rectangle(){
return $this->width * $this->height;
}
}
クラス内のプロパティへのアクセス
クラス内のメソッドからクラス内のプロパティへアクセスする際は、 $this->を使用します。
コンストラクタとは
コンストラクタとは、インスタンス化する時(newされた時点)に自動的に実行されるクラス内のメソッドのことです。 PHP4までは、クラス名と同名のメソッドがコンストラクタとなります。PHP5からは、 __constructというメソッド名をもつものがコンストラクタとなります。コンストラクタは 初期化処理などを記述します。省略することも可能です。
デストラクタとは
デストラクタとは、オブジェクトが破棄される際に実行されるメソッドのことです(PHP5から)。 __destructというメソッド名を使用します。終了処理などを記述します。
publicとprivate
publicやprivateなどはアクセス修飾子と呼ばれ、 プロパティやメソッドへのアクセスを制御するためのものです。
| public | どこからでもアクセス可能 |
|---|---|
| protected | 現在のクラスとサブクラスでのみアクセス可能 |
| private | 現在のクラスでのみアクセス可能 |
varはpublicと 同じ意味です。varはPHP4でも使用できます。
privateのプロパティーは、外部からアクセスできません。 クラス内のprivate変数にアクセスするためのメソッドをアクセサメソッドと呼びます。 ゲッタメソッドとセッタメソッドの例を以下に示します。
public function get_example(){
return $this->example;
}
public function set_example(引数){
$this->example = 引数;
}
最初は面倒に感じるかも知れませんが、ゲッタメソッドやセッタメソッドを利用すると、 クラス内部のデータ表現を変えたいケースでも呼び出し側のコードを変更する必要がないという利点があります。
サンプル(セッタメソッドを利用)
さきほどの長方形の面積を求めるクラスを、セッタメソッドを利用して書き換えてみましょう。
class GetArea {
private $width;
private $height;
public function rectangle(){
return $this->width * $this->height;
}
public function set_width($width){
if(is_numeric($width)){$this->width=$width;}
}
public function set_height($height){
if(is_numeric($height)){$this->height=$height;}
}
}
クラスを呼び出した後のコードは次のようにします。
$obj=new GetArea();
$obj->set_width(10);
$obj->set_height(7);
print ('面積='.$obj->rectangle());
静的メソッド
静的メソッドとはオブジェクトを生成しなくても利用できるメソッドのことです。 静的メソッドを定義するためには、メソッド定義の際にstatic修飾子をつけます。 クラスの外部から静的メソッドを呼び出すためには、::演算子を利用します。
クラス内定数
クラス内定数とはクラス内で定義された定数です。constを定義の先頭につけます(PHP5から)。
継承
継承とは、あるクラスのプロパティやメソッドを引き継ぎながら、新しいプロパティやメソッドを追加したり 修正したりする機能のことです。
スーパークラスとサブクラス
継承元のクラスをスーパークラス(または基底クラスあるいは親クラス)、 継承先のクラスをサブクラス(または派生クラス)と呼びます。 PHPでの継承は単一継承です。つまり、あるサブクラスのスーパークラスは1つだけです。
class SubExampleClass extends ExampleClass {
・・・
}
オーバーライド
オーバーライドとは、スーパークラスのメソッドなどをサブクラスで上書きすることです。
スーパークラスのメソッドを呼び出すには
スーパークラスのメソッドを呼び出すには、parentを用いて、たとえば、parent::sampleMethodのように使用します。
final修飾子
final修飾子は、メソッドをオーバーライドできないように制限するための修飾子です。
ポリモーフィズム(多態性)
ポリモーフィズムとは、同名のメソッドで異なる処理を実現することです。
抽象メソッド
抽象メソッドとは、処理部分のないメソッドのことです。 抽象メソッドはabstract修飾子で定義します。 抽象メソッドは処理部分がないため、必ずサブクラスで定義します。
抽象クラス
抽象クラスとは、抽象メソッドを含むクラスのことです。抽象クラスから直接にオブジェクトを生成することはできません。 抽象クラスも抽象メソッドと同様にabstract修飾子で定義します。
インターフェース
インターフェースとは、メソッドがすべて抽象メソッドであるクラスのことです。 インターフェースを定義するときはinterfaceを使用します。
interface インターフェース名 {
public function メソッド名();
}
インターフェースを実装 する場合は、implementsを使用します。
class クラス名 implements インターフェース名[,インターフェース名...] {
メソッドを実装
}
インターフェースはクラスと異なり、多重「継承」が可能です。
PHP5とオブジェクト指向
__autoload
__autoload関数は、未定義クラスを呼び出したタイミングで自動的に呼び出される特別な関数です。 __autoload関数を利用すると、クラスごとにrequire_once関数を呼び出す必要がなくなります。 autoload.phpを自動的に読み込むためには、.htaccessファイルを利用します。 .htaccessファイルはこちらも参照してください。
__call
__callメソッドは、未定義のメソッドが呼び出された場合の処理を定義するためのメソッドです。
__get
__getメソッドは、未定義のプロパティを取得しようとしたタイミングで呼び出されるメソッドです。
__set
__setメソッドは、未定義のプロパティを設定しようとしたタイミングで呼び出されるメソッドです。
例外処理
PHP5では例外処理としてtry?catch構文が利用できるようになりました。
try {
(例外が発生する可能性のあるコード)
} catch {
(例外が発生した場合の処理)
}