2016-11-30 5 views
1

Ich möchte eine Klassenberechtigung deklarieren, die um mehrere untergeordnete Klassen erweitert wird.PHP: Erweitern Sie die Authentifizierungsklasse mit den Methoden von childs

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

Nun möchte Ich mag die Elternklasse nennen und alle untergeordneten Klassen Methoden authUser() versuchen, bis ein true zurück.

Also ich würde sagen, es ist nicht sinnvoll, alle Kinder manuell instanziieren. Wie kann ich damit umgehen?

UPDATE

Derzeit löse ich das mit get_declared_classes() und ReflectionClass. Ist das auf einem besseren Weg lösbar?

Antwort

3

Elternklasse sollte nicht über eigene Kinder wissen. Reflection API und verwandte Funktionen sind keine gute Wahl, um eine High-Level-Logik zu implementieren. In Ihrem Fall können Sie ein Muster wie Strategy verwenden.

Zuerst erklären wir generische Schnittstelle von Authentifizierungsmethode:

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

Als Nächstes fügen wir ein einige benutzerdefinierte Implementierungen dieser Schnittstelle:

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

Dann erstellen wir noch eine weitere Implementierung, die eine Sammlung hält bestimmter Strategien. Seine authUser() Methode übergibt wiederum Authentifikationsparameter an jede innere Strategie, bis einer wahr zurückgibt.

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

Es ist nicht der einzige Weg, um Ihr Problem zu lösen, aber nur ein Beispiel.

+0

Vielen Dank. In diesem Fall muss ich eine Instanz jeder Kindklasse hinzufügen - ist das nicht automatisch möglich? – alve89

+0

Diese Aufgabe kann auf viele Arten gelöst werden. Die gewählte Methode hängt von Ihrem Anwendungsdesign ab. Lesen Sie zum Beispiel [Service Locator] (https://en.wikipedia.org/wiki/Service_locator_pattern) und [Dependency Injection] (https://en.wikipedia.org/wiki/Dependency_injection). Das automatische Erstellen und Binden von Instanzen wird oft auch als "Autowiring" bezeichnet. Diese Funktion wird von vielen Bibliotheken und Frameworks bereitgestellt. – Timurib

Verwandte Themen