2016-11-30 13 views
1

複数の子クラスによって拡張されたクラス認証を宣言したいと思います。PHP:子クラスのメソッドで認証クラスを拡張する

// Parent class that should be called 
abstract class auth 
{ 
    // Force child classes to implement this method 
    abstract public function authUser($uid, $pw); 
} 

class configAuth1 extends auth 
{ 
    public function authUser($uid, $pw) 
    { 
     // Do some authentication stuff 
     return false; 
    } 
} 

class configAuth2 extends auth 
{ 
    public function authUser($uid, $pw) 
    { 
     // Do some authentication stuff 
     return true; 
    } 
} 

今、私は1つがtrueを返すまで親クラスを呼び出し、すべての子クラスメソッドauthUser()を試してみたいと思います。

だから私はすべての子を手動でインスタンス化するのは意味がないと言っています。 どうすれば対応できますか?

UPDATE

現在、私はget_declared_classes()ReflectionClassでこれを解決します。これはより良い方法で解決可能ですか?

答えて

3

親クラスでは、自分の子供について知るべきではありません。リフレクションAPIおよび関連する関数は、高水準ロジックを実装するための良い選択ではありません。 あなたの場合、Strategyパターンのようなものを使用できます。

まず、我々は認証方式の汎用インタフェース宣言:

/** 
* Common authentication interface. 
*/ 
interface AuthStrategyInterface 
{ 
    public function authUser($uid, $pw); 
} 

次に、我々は、このインターフェースのいくつかのカスタム実装を追加します。

/** 
* Firsts implementation. 
*/ 
class FooAuthStrategy implements AuthStrategyInterface 
{ 
    public function authUser($uid, $pw) 
    { 
     return true; 
    } 
} 

/** 
* Second implementation. 
*/ 
class BarAuthStrategy implements AuthStrategyInterface 
{ 
    public function authUser($uid, $pw) 
    { 
     return false; 
    } 
} 

その後、我々は、コレクションを保持してさらに別の実装を作成します具体的な戦略の そのauthUser()メソッドは、trueを返すまで、すべての内部戦略に認証パラメータを渡します。

/** 
* Collection of nested strategies. 
*/ 
class CompositeAuthStrategy implements AuthStrategyInterface 
{ 
    private $authStrategies; 

    public function addStrategy(AuthStrategyInterface $strategy) 
    { 
     $this->authStrategies[] = $strategy; 
    } 

    public function authUser($uid, $pw) 
    { 
     foreach ($this->authStrategies as $strategy) { 
      if ($strategy->authUser($uid, $pw)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

これは問題を解決する唯一の方法ではなく、単なる例です。

+0

ありがとうございます。この場合、私はすべての子クラスのインスタンスを追加する必要があります - これは自動的に可能ではありませんか? – alve89

+0

そのタスクは多くの方法で解決される可能性があります。選択した方法は、アプリケーションの設計によって異なります。たとえば、[Service Locator](https://en.wikipedia.org/wiki/Service_locator_pattern)と[Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection)を参照してください。また、インスタンスの自動作成とバインディングは、多くのライブラリやフレームワークによって提供される「自動配線」と呼ばれることがあります。 – Timurib