“インターフェイス”は“機能の名前”だなんて書きましたが、PHPにおける「インターフェイス」も同様に“機能の名前”です。“機能の名前”の“機能”って何の事なのか?それはオブジェクトが提供する「パブリック」なメソッドの事です。オブジェクトを扱う時、使用するのはクラス外に公開される「パブリック」なメソッドのみで、「プライベート」又は「プロテクテッド」なメソッドは、オブジェクト内部でのみ使用されるため、その存在を意識する必要はありません。オブジェクトが提供する「パブリック」なメソッドが、オブジェクトが提供する“機能”です。オブジェクトはある役目を持っていて、その役目を果たすには“備えているべき機能”を備えている必要があります。“テレビのリモコン”でありうる為には“テレビのリモコン”でありうる為の“備えているべき機能”を備えていなければならない様に、ある役目を持ったオブジェクトも、そのオブジェクトでありうる為の“備えているべき機能”つまり“備えているべきメソッド”を備えていなければなりません。オブジェクトが“備えているべきメソッド”は1つとは限りません。“備えているべきメソッド”が複数である場合が殆どです。1つでも“備えているべきメソッド”を備えていないと、そのオブジェクトはそのオブジェクトではありえません。全て備えて初めて、そのオブジェクトでありうるのです。要するに、「インターフェイス」は単なる“機能(メソッド)の名前”ではなく、“備えているべき機能(メソッド)の名前”であり、更に“備えているべきメソッド”は複数から構成されていて、その全てをひっくるめた全体の機能をいいます。“テレビのリモコン”は“テレビのリモコン”という機能を持っているから“テレビのリモコン”でありうるのです。スクリプトを作り、その中でクラスを定義する時、行き当たりばったりで適当に定義する場合もあれば、ちゃんと仕様を決めてから定義する場合もあると思いますが、仕様を決めてから定義する場合、定義するクラスが何の為のクラスでどのような機能を持っているのか、作り始める前に決定しているはずです。仕様決定の段階では、どのような機能を持つのかだけ決めればよく、構造まで決める必要はありません。逆に、仕様で決めた機能を搭載し忘れたらダメです。具体的にPHPではどのようなものなのか?クラスの定義に近いものですが、こちらは「interface」で定義し、更に「抽象メソッド」だけを定義します。これは殆ど「抽象メソッド」だけを備えた「抽象クラス」と同じです。「インターフェイス」は「抽象メソッド」しか定義できないので、「抽象メソッド」の定義時に使用する「abstract修飾子」は省略出来ます(省略してもしなくても「抽象メソッド」になる)。「インターフェイス」の定義方法はクラスの定義方法と殆ど同じですが、この「インターフェイス」は「抽象クラス」みたいなもので、これのインスタンスを生成するというものではなく、継承した別のクラスがインスタンスを生成出来ます。(え?)、「インターフェイス」はクラスの様に「extends」を使って“継承”されるのではなく、「implements」を使って“実装”されます。“継承”と“実装”の違いは、“継承”の場合、基底クラスの「抽象メソッド」の処理部を実装しないと自身も「抽象クラス」になるだけですが、“実装”の場合は、「インターフェイス」に定義されたメソッドを全てオーバーライドして処理部を実装しなくてはなりません。実装漏れがあるとその時点で「E_ERROR」エラーを発します。“継承”は一度に1つのクラスからしか出来ませんが、“実装”の場合は「,(コンマ)」で区切って複数指定できます。「インターフェイス」が備えるメソッドは全て「パブリック」に宣言しなくてはなりません。それ以外の可視性では「E_ERROR」エラーを発します(そもそも“インターフェイス”は外部に提供するものなので)。アクセス制限修飾子を省略した場合の可視性は「パブリック」なので、「インターフェイス」の定義ではアクセス制限修飾子の宣言は殆ど意味が無いので省略します。「インターフェイス」はメンバ変数を持つ事が出来ません(“インターフェイス”の意味を考えれば、処理内部で使われるプロパティを定義する必要が無いのが解かる。「インターフェイス」はクラスの様に“オブジェクトの構造を定義するもの”ではなく、“機能の形態を定義するもの”です)が、クラス定数(「インターフェイス定数」と呼ぶ事にする)は定義することが出来ます。「インターフェイス定数」は、それを所有する「インターフェイス」があるクラスに実装された場合、身分的(?)にそのクラスで定義されたクラス定数となります。実装した「インターフェイス」が持つ「インターフェイス定数」と同じ名前のクラス定数を定義出来ません(定数の再定義となって「E_ERROR」エラーを発します)。インターフェイス名」と、“継承”が“実装”の左側に来るようにします。逆にするとシンタックスエラーになります。これまた論よりコード。以下のサンプルと結果をご覧下さい。HODENASU例によって、コメントアウトしている所で「E_ERROR」エラーが発生します。}」の部分で、「iHODE」という名前の「インターフェイス」を定義しています。クラスの定義と似ていますが、定義部で定義できるのは、インターフェイス定数(クラス定数の様なもの)と抽象メソッドのみです。定義出来るメソッドが抽象メソッドのみなので、「abstract修飾子」が省略出来ます。可視性は特性上常に「パブリック」です。スタティックメソッドの定義も可能。「インターフェイス」は、クラスに“継承”ではなく“実装”されます。「implements」を使って“実装”され、複数の「インターフェイス」が指定できます。クラスは、全てのメソッドをオーバーライドして実装しなくてはなりません。「インターフェイス」とそれを実装したクラスは、継承関係にあるわけではないので、インターフェイス定数を「parent::iHODE_CONST」で参照する事は出来ません。ある役目を持ったクラスを定義する時、クラスに与えるその役目を果たす為の第一条件は、“クラスが役目を果たす為の機能を備えている事”です(“テレビのリモコン”は“テレビのリモコンとしての機能”を備えているから“テレビのリモコン”でありうる様に)。やって各機能を実現するかよりも、役目を果たす為の機能を全て備えている事がまず大事です。具体的な処理部の実装とは別問題として考える為に態々「インターフェイス」を定義します。ところで、“物と人がより正確にコミュニケート出来るように「インターフェイス」を設計しなくてはならない”なんて書きましたが、PHPにとっての「インターフェイス」はどのように意識して設計すればよいのでしょうか?それは“判り易い名前を付ける事”です(それだけ?)。PHPのビルトインクラスのメソッドや、PEARにて配布されているクラスのメソッドの名前は、「getXxxYyy()」や「setXxxYyy()」、「createXxxYyy()」のように、意味的に共通するメソッド名は共通する接頭辞なんかを付けたりしています。これらのコードを参考にして、メソッドのネーミングを行うと良いです。「インターフェイス」は「extends」を使って、他の「インターフェイス」を継承して拡張する事が出来ます。継承する場合、「,(コンマ)」で区切って複数指定できます。以下のサンプルと結果をご覧下さい。error:継承元の「インターフェイス定数」を再定義出来ない)インターフェイス「iHODENASU」に、インターフェイス「iHODE」とインターフェイス「iNASU」を継承させました。結果的に「HODENASU1」クラスと「HODENASU2」クラスは全く同じ構造です。以下のサンプルと結果をご覧下さい。))「class_implements()」関数は、「指定したオブジェクトが実装するインターフェイス名を配列に格納して返す」関数です。サンプルの結果を見ると、何れのクラスも「iBASE」インターフェイスを実装しているのが判ります。“ある別の「インターフェイス」を実装したクラス”を継承したクラスも、“ある別の「インターフェイス」を継承した「インターフェイス」”を実装したクラスも、そのクラスは継承元の「インターフェイス」を実装していると見なされます。関数やクラスのメンバ関数の定義時に“オブジェクト引数のクラス指定(「オブジェクト引数のクラス指定」のページで解説)”が出来ますが、同様に「インターフェイス名」も指定することが出来ます。この場合、渡されたオブジェクトが、指定された「インターフェイス」を実装しているか否かがチェックされます。error:インターフェイス「iNDA」を実装していなければならない)単純に、渡されたオブジェクトが指定した「インターフェイス」を実装していればOKで、実装していなければ「E_ERROR」エラーを発します。定義済みのインターフェイスPHPには予め幾つかの「インターフェイス」が定義されています。定義済みの「インターフェイス」にはどのようなものがあるのか、下記のスクリプトを実行して見てみます。))定義済みの「インターフェイス」と定義されるメソッド名を出力しました。今の所(PHP5.0.3)この7つが定義されています。ついでに、定義済みの「インターフェイス」を実装する定義済みクラス名を抽出、出力しました。今回のサンプルで取得できた、現在定義されている7つの「インターフェイス」は、「イテレーション」と「リフレクション」で扱います。ちなみに、サンプル中の「ReflectionClass」クラスも「リフレクション」で扱います。詳細については各ページで解説します。