2013年3月27日水曜日

PHP インターフェース

インターフェース

インターフェースを定義するにはclassキーワードの代わりにinterfaceキーワードを使用します。
インターフェース内のメソッドは抽象メソッドになるので、メソッドの宣言だけを定義し、処理内容は定義しません。
メソッドにはabstractキーワードは付けません。
アクセス修飾子はpublicのみが指定できます。
interface インターフェース名 {
    public function メソッド名($arg1);
}

インターフェースを実装するにはimplementsキーワードを使用します。
複数のインターフェースを実装するにはインターフェース名をカンマで区切ります。
インターフェースを実装したクラスは、インターフェースに定義されているメソッドをすべてオーバーライドする必要があります。
メソッドをオーバーライドしたとき、引数はオーバーライド元のメソッドと同じにするか、省略可能な引数を追加することができます。
class クラス名 implements インターフェース名1, インターフェース名2 {
    public function メソッド名($arg1, $arg2=''){
        処理内容;
    };
}

コンストラクタもインターフェースで定義することができます。
マニュアルには「ひとつのクラスの中で、同じ名前の関数を含む 2 つのインターフェイスを 実装することはできません。あいまいさを解決できなくなるためです。」とありましたが 、実装してもエラーにはならないようです。
<?php
//インターフェース1
interface MyInterface1 {
    public function Method();
    public function Method1($value);
    public function __construct();
}
//インターフェース2
interface MyInterface2 {
    public function Method();
    public function Method2($value);
}
//インターフェースを実装したクラス
class MyClass implements MyInterface1, MyInterface2 {

    public function Method1($value, $str='') { print('Method1</br>'); }
    
    public function Method2($value, $str='') { print('Method2</br>'); }
    
    public function Method(){ print('Method</br>'); }
    
    public function __construct($str=''){}
}
//使用例
$obj = new MyClass();
$obj->Method();
$obj->Method1(1);
$obj->Method2(2);
?>
実行結果


インターフェースを継承し新たなインターフェースを作成することができます。
<?php
//親インターフェース
interface ParentInterface {
    public function Method1();
}
//子インターフェース
interface ChildInterface extends ParentInterface {
    public function Method2();
}
//親インターフェースを実装したクラス
class Class1 implements ParentInterface {

    public function Method1() { print('Method1</br>'); }
    
}
//子インターフェースを実装したクラス
class Class2 implements ChildInterface {

    public function Method1() { print('Method1</br>'); }
    
    public function Method2() { print('Method2</br>'); }
    
}
//使用例
print('-----Class1-----</br>');
$class1 = new Class1();
$class1->Method1();

print('-----Class2-----</br>');
$class2 = new Class2();
$class2->Method1();
$class2->Method2();
?>
実行結果

0 件のコメント: