クラスを学ぶ上でよく出てくる単語(メンバ変数、メソッド、オブジェクト、インスタンス)
クラスはプロパティとメソッドで構成されます。そのクラスが生成するオブジェクトを使うには、「new演算子」を用いてインスタンス化します。
プロパティとメソッド
プロパティはメンバ変数、フィールド、属性とも呼ばれる変数や定数のことです。メソッドは関数のことを言います。
クラスとは
クラスとはいわば設計図のようなもので、これに対しインスタンスは実際に出来上がったデータのことを指して言います。また、これらを含んだ対象物をオブジェクトと呼んでいます。
定数と変数
定数と言えば、define(定数名, 値)でも知られますが、これはグローバル定数でどこでも使えます。これに対し、クラス定数はクラス内で定義します。
定数の定義と参照
クラス定数を作る場合、constを使って「const 定数名 = 値;」という書式で定義します。定数名の先頭に「$」をつけません。クラス内で参照するには「self::定数名;」とし、外部から参照するには「クラス名::定数名;」とします。
変数の定義と参照
クラス変数を作る場合、staticを使って「static 変数名 = 値;」という書式で定義します。クラス内で参照するには「self::変数名;」とし、外部から参照するには「クラス名::$変数名;」「クラス名::メソッド名();」とします。staticを使えば参照するためのインスタンス化を要せず、直接クラスのメンバ変数にアクセスできるようになります。但し、アロー演算子は使えません。
$this
クラスの中では、「クラス名->name」というような記述ができません。これはプログラムがアクセスできるオブジェクト名を認識できないためです。そのため、PHPでは擬似変数である「$this」が用意されており、「$this->name」というような書式で自身のクラス内部にある関数や変数を取り扱うことができるようになっています。つまり、「$this」は自分自身を意味します。
self::
self:: は、自身のクラスを指します。クラス定数、スタティック変数、スタティックメソッドはインスタンス化を必要としません。このため、$thisが使えず、selfを利用します。「::」は、スコープ演算子と呼ばれているもので、定数やstatic、また上書きされたクラスのプロパティやメソッドにアクセスできます。
アクセス権
「public」「private」「protected」はアクセス権と呼ばれているもので、「public」はどこからでもアクセス可能です。「private」は自身のクラス内のみで利用できます。「protected」は、自分が属するクラス、自身のクラスを継承したクラス、そして親クラスからのみアクセスできます。
クラスの継承「extends」
「extends」は他のクラスのメソッドと プロパティを継承させます。「class 自身のクラス名 extends 親クラス名」という風に宣言部に「extends」を記述します。親クラスのメンバ変数を全て継承しますが、修飾子が「private」である場合は継承されません。代わりに「protected」を使います。また、多重継承はできません。
コンストラクタ
「__construct()」 はコンストラクタと言い、オブジェクトを作る際に自動的にコールされます。また、祖先クラスに設定されている場合、子孫のクラスは明示的にparent::__construct()をコールしなければなりません。
デストラクタ
「__destuct() 」はデストラクタと言い、 オブジェクトを参照するリファレンスが全く無くなった時にコールされます。また、スクリプトの終了時にも順不同で呼び出されます。
オートロード
「__autoload() 」関数を使うことでクラス定義されたファイルを自動でコールします。 「__autoload() 」 は、一度しか定義できません「spl_autoload_register()」は複数の autoload 関数が必要となるケースでも対応できます。
タイプヒンティング
タイプヒンティングは引数に型を指定することで、それ以外の型を通さないようにします。指定可能なのは、クラス名、インタフェース名、配列(array)、コールバック関数(callable)、int(引数はinteger)、float(引数はfloat)、string(引数はstring)、bool(引数はboolean)、となります。
オブジェクトのコピー
オブジェクトのコピーで「$object1=$object2;」とすると、オブジェクトへの参照が代入され、同じオブジェクトを指します。「$object1=clone $object2;」とすることで「$object1」とは別のクローンが作成されます。
オーバーライド
オーバーライドは上書きのことです。同じ関数名を子クラスに定義することで、親クラスの変数や関数をオーバーライドできます。但し、「final」をつけたメソッドは子クラスで上書きできません。
名前空間
名前空間は変数名や関数名の重複を避けるために使われます。「namespace foo\bar;」等と記述し、階層構造が使えます。「use 名前空間識別子 as 識別子名」等で参照します。
抽象クラス
抽象クラスは他のクラスで引き継いでもらうクラスで、抽象クラスそのものをインスタンス化することはできません。実装は「abstract 抽象クラス名」の書式で定義し、継承するには抽象クラスで上書きする必要があります。抽象クラスはサブクラスを必ず定義してオブジェクト化します。利用形態は、似たような処理の中で、若干異なる処理を加える場合などです。
インターフェイス
インターフェイスは、複数のクラスで同じメソッドを使う場合に利用されます。インターフェイスを実装するクラスを必ず定義してオブジェクト化します。インターフェイス内で利用できるアクセス修飾子はpublicのみです。定義するにはキーワード「class」のかわりに「interface」 を用います。「interface インターフェイス名」の書式を使い、複数の場合はカンマで区切ります。また実装の無いメソッドを使います。クラスへの実装は「class クラス名 implements インターフェイス名」となります。その際、インターフェイスで宣言されたメソッドをすべて実装します。その他、クラスと同じく「extends」での継承ができます。
抽象クラスとインターフェイスの違い
インターフェイスはメソッドの実態を定義できませんが、複数実装できます。これに対し、抽象クラスはメソッドの実態を定義できますが、引き継がれるのは一つです。