前に、タイプヒンティング(型宣言)について調べたら、インターフェイスと組み合わせると効果的となっていたんですが、PHPマニュアルによると、
『 インターフェイスとタイプヒンティングを組み合わせると、 特定のオブジェクトに特定のメソッドをうまく持たせることができます。』と書いていて、
『instanceof 演算子および タイプヒンティング を参照ください。』となってました。
⇩ インターフェイスについては下記サイトへ
PHPマニュアル(オブジェクトインターフェイス)によるインターフェイスの説明は、
オブジェクト インターフェイス
オブジェクトインターフェイスにより、あるクラスが実装する必要があるメソッドの 種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できる ようになります。
インターフェイスはキーワード interface により定義され、通常のクラスと 同様に定義することができますが、メソッドの実装は全く定義されません。
インターフェイス内で宣言される全てのメソッドはpublicである必要があります。
これは、インターフェイスの特性によります。
implements
インターフェイスを実装するには、implements 演算子を使用し、 このインターフェイスに含まれる全てのメソッドを実装する必要があります。
実装されていない場合、致命的エラーとなります。
各インターフェイスをカンマで区切って指定することで、 クラスは複数のインターフェイスを実装することができます。
注意: PHP 5.3.9 より前のバージョンでは、ひとつのクラスの中で同じ名前のメソッドを定義した2つのインターフェイスを実装することはできませんでした。
曖昧さを解決できなくなるためです。
PHP 5.3.9 以後のバージョンでは、同じ名前のメソッドが同じシグネチャを持っている場合に限り、こうした実装を行えるようになっています。
注意: クラスと同様、インターフェイスも extends 演算子で継承することができます。
注意: インターフェイスを実装したクラスには、 そのインターフェイスで定義されているメソッドとまったく同じシグネチャを持つメソッドが必要です。
そうしなければ致命的なエラーが発生します。
シグネチャ(signature)
関数の名称とそれらの型情報の組を合わせたものをシグネチャと呼ぶが、プログラム内でシグネチャが唯一に決まれば、関数名やメソッド名、演算子の記号が重複していても呼び出すべき対象を唯一に決定することが出来る。
定数
インターフェイスに定数を持たせることもできます。
インターフェイス定数は クラス定数 とまったく同じように動作します。
しかし、 そのインターフェイスを継承したクラスやインターフェイスから上書きすることはできません。
例1 Interface の例
<?php
// インターフェイス 'iTemplate' を宣言する
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// インターフェイスを実装する。
// これは動作します。
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// これは動作しません。
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
setVariable( )とgetHtml( )は、
『PEAR』というPHPの標準ライブラリで、多くの機能が提供されていて、機能ごとのライブラリをパッケージと呼んでいるもの、その『PEAR』のパッケージの中のメソッドのようです。
PEARのパッケージは、PHPで書かれたクラスの集まりです。
⇩ PEARの公式ページは下記
⇩ PEAR関連
・【php】PEAR?PEAR2?Pyrus?何が違うの? at softelメモ
⇩ PEAR講座
PEAR(PHP Extension and Application Repository)
PHPで利用する事ができるライブラリ(パッケージ)を提供しているサービス。 PEARはPHPで書かれたライブラリを提供しているが、C言語で書かれた拡張ライブラリ(extension)を提供するPECLというサービスも存在する。
例2 インターフェイスの継承
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// これは動作します
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// これは動作せず、fatal error となります
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
例3 複数のインターフェイスの継承
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
例4 インターフェイスでの定数
<?php
interface a
{
const b = 'Interface constant';
}
// Interface constant と表示します
echo a::b;
// しかし、これは動作しません。定数のオーバーライドが
// できないからです。
class b implements a
{
const b = 'Class constant';
}
?>
目次
SPL インターフェイス および 定義済のクラス も参照ください。
インターフェイス | 説明 |
---|---|
Traversable |
そのクラスの中身が foreach を使用してたどれるかどうかを検出するインターフェイスです。 これは抽象インターフェイスであり、単体で実装することはできません。 IteratorAggregate あるいは Iterator を実装しなければなりません。 このインターフェイスにはメソッドがありません。 traverse 可能なすべてのクラス用の基底インターフェイスとしてのみ存在しています。 注意: このインターフェイスを実装した内部クラス (組み込みクラス) は foreach で使用することができます。 IteratorAggregate や Iterator を実装する必要はありません。 これは内部エンジンのインターフェイスであり、PHP スクリプトないで実装することはできません。 そのかわりに IteratorAggregate あるいは Iterator を使用しなければなりません。 Traversable を継承したインターフェイスを実装するときは、 implements 句の中でそのインターフェイスより前に IteratorAggregate か Iterator を指定しておきましょう。 |
Iterator | 外部のイテレータあるいはオブジェクト自身から反復処理を行うためのインターフェイスです。 |
IteratorAggregate | 外部イテレータを作成するためのインターフェイスです。 |
Throwable |
Throwable は、PHP 7 の throw 文でスロー可能なあらゆるオブジェクトが実装する基底インターフェイスです。 Error や Exception も、これを実装しています。 注意: PHP のクラスが Throwable インターフェイスを直接実装することはできません。 そのかわりに、Exception を継承する必要があります。 |
ArrayAccess | 配列としてオブジェクトにアクセスするための機能のインターフェイスです。 |
Serializable |
このインターフェイスを実装したクラスは __sleep() や __wakeup() をサポートしなくなります。 シリアライズが必要な場合には、自動的に serialize メソッドがコールされます。 このメソッドは __destruct() を実行しません。また、 メソッド内で明示的に書かない限りは一切の副作用を及ぼしません。 アンシリアライズされるときにはそのクラスが自動的に検知し、__construct() メソッドのかわりに適切な unserialize() メソッドがコールされます。 標準のコンストラクタを実行させたい場合は、unserialize() メソッドの中でそれをコールします。 |
Closure |
無名関数 を表すために使うクラスです。 無名関数は PHP 5.3 で実装された機能で、この型のオブジェクトを生成します。 かつてこれは、内部実装がたまたまそうなっているだけという扱いでした。 しかし今では、この事実を前提として考慮してもかまいません。 PHP 5.4 以降ではこのクラスにメソッドが用意され、 生成した無名関数をさらにコントロールできるようになります。 ここであげたメソッド以外にも、このクラスには __invoke メソッドが存在します。 これは、マジックコール を実装した他のクラスとの一貫性を保つためのものであり、 関数をコールするときにこのメソッドは使われません。 |
Generator |
Generator は ジェネレータ が返すオブジェクトです。 警告 |
イテレータ(Iterator)
プログラミング言語において配列やそれに類似するデータ構造の各要素に対する繰返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。反復するためのものの意味で反復子(はんぷくし)と訳される。繰返子(くりかえし)という一般的ではない訳語もある。
イテレータ、分かりにくいっす。
⇩ イテレータについて詳しくは下記サイトへ