2017-03-28 8 views
1

PHPにインタフェース関数を作成するための代替機能がありますか?パラメータはオブジェクトでなければならないが、指定されていないオブジェクトは何か?カスタムオブジェクトを使用してインタフェース関数を作成する

interface Container { 
    public static function add(\Employee $element); 
} 

今私は「従業員」からインスタンスを必要とするパラメータ、との機能を実装することができます

今、私のコードは次のようになります。私は今のクラスでそれを実装する場合には、次のようになります。

class EmployeeContainer implements Container { 
    public static function add(\Employee $element) { 
     $pnr = $element->getPNR(); 
    } 
} 

私はコンテナを実装する別のクラスを作成し、練習に例えば必要なオブジェクトを設定すると、PHPコンパイラはエラーをスロー:

class TraineeContainer implements Container { 
    public static function add(\Trainee $element) { 
     $pnr = $element->getPNR(); 
    } 
} 

Fatal error: Declaration of TraineeContainer::add($element) must be compatible with Container::add(Employee $element)

必要なオブジェクトをカスタムオブジェクトにインターフェイスで設定する方法はありますか?

なぜこれが欲しいですか?

多くのIDEが、この形式のインスタンス記述をサポートして、オブジェクトに基づくメソッドを提案しています。

+0

あなたはTraineeとEmployeeに同じ基本クラスを使用し、そのクラスをインターフェイス –

+0

の引数として使用できます@ChetanAmeta例を表示できますか、それは想像できません。 –

+0

回答の例を見てください –

答えて

1

、カスタマーオブジェクトの引数はインターフェースでは不可能ですが、あなたは他の方法でそれを達成することができます唯一の方法ですあなたのメソッド内で引数の型をチェックする必要があります。

あなたがあなたので​​共通機能を持っているようだ

interface Container { 
    public static function add(SomeBaseClass $element); 
} 

class EmployeeContainer implements Container { 
    public static function add(SomeBaseClass $element) { 
     $pnr = $element->getPNR(); 
    } 
} 

class TraineeContainer implements Container { 
    public static function add(SomeBaseClass $element) { 
     $pnr = $element->getPNR(); 
    } 
} 

あなたのインターフェイスに引数としてSomeBaseClassを使用

class Employee extends SomeBaseClass{ 

} 

class Trainee extends SomeBaseClass{ 

} 

あなたのクラスを拡張

class SomeBaseClass{ 

} 

共通の基底クラスを作成します抽象クラスまたはインタフェースを作成して使用できますそれはあなたの子供のクラスで。

+1

さて、良いアイデア。ありがとう。 –

2

残念ながら。

public static function add($element) { 
    if(!$element instanceof \Trainee) { 
     throw new \InvalidArgumentException("your exception message"); 
    } 

    $pnr = $element->getPNR(); 
} 
関連する問題