2016-11-30 2 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; 
    } 
} 

지금은 부모 클래스를 호출하고 하나에 해당하는 반환 될 때까지 모든 하위 클래스 메서드를 authUser()을 시도하고 싶습니다.

그래서 나는 모든 자식을 수동으로 인스턴스화하는 것은 의미가 없다고 말하고 싶습니다. 어떻게 처리 할 수 ​​있습니까?

UPDATE는 현재 내가 get_declared_classes()ReflectionClass으로이 문제를 해결. 더 나은 방법으로 해결할 수 있습니까?

답변

3

부모 클래스는 자신의 자녀에 대해 알아서는 안됩니다. 리플렉션 API 및 관련 함수는 상위 수준의 로직을 구현하기에 적합하지 않습니다. 귀하의 경우에는 Strategy 패턴과 같은 것을 사용할 수 있습니다.

/** 
* 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; 
    } 
} 

그리고 우리는 컬렉션을 보유 또 다른 구현을 만들 :

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

다음으로, 우리는이 인터페이스의 일부 사용자 지정 구현을 추가 : 먼저

, 우리는 인증 방법의 일반적인 인터페이스를 선언 특정 전략의 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)에 대해 읽으십시오. 또한 인스턴스의 자동 생성 및 바인딩은 종종 "Autowiring"이라고하며이 기능은 많은 라이브러리 및 프레임 워크에서 제공됩니다. – Timurib