2013-07-15 2 views
10

Kann überprüft werden, ob eine Methode in PHP von einer untergeordneten Klasse überschrieben wurde?php überprüfen, ob die Methode in der untergeordneten Klasse überschrieben wurde

<!-- language: lang-php --> 

class foo { 
    protected $url; 
    protected $name; 
    protected $id; 

    var $baz; 

    function __construct($name, $id, $url) { 
     $this->name = $name; 
     $this->id = $id; 
     $this->url = $url; 
    } 

    function createTable($data) { 
     // do default actions 
    } 
} 

Kinderklasse:

class bar extends foo { 
    public $goo; 

    public function createTable($data) { 
     // different code here 
    } 
} 

Wenn durch eine Reihe von Objekten als Mitglieder dieser Klasse definiert laufen, wie kann ich überprüfen, welche der Objekte, die neue Methode hat als mit dem alten Gegensatz? Funktioniert eine Funktion wie method_overridden(mixed $object, string $method name)?

foreach ($objects as $ob) { 
    if (method_overridden($ob, "createTable")) { 
     // stuff that should only happen if this method is overridden 
    } 
    $ob->createTable($dataset); 
} 

Ich bin mir der template method pattern, aber lassen Sie uns sagen, dass ich die Kontrolle des Programms wollen aus der Klasse getrennt sein und die Methoden selbst. Ich würde eine Funktion wie method_overridden benötigen, um dies zu erreichen.

+0

Überladene oder außer Kraft gesetzt? Ich dachte, PHP hatte keine Methode überladen –

+0

Ich meinte, überfahren, ja – Joey

+1

Sie könnten dies versuchen: http://www.php.net/manual/en/reflectionclass.hasmethod.php –

Antwort

16

Überprüfen Sie, ob die deklarierte Klasse die Klasse des Objekts entspricht:

$reflector = new \ReflectionMethod($ob, 'createTable'); 
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob)); 
+0

Dies ist sicherlich die Art und Weise, wie ich darüber gehen will, aber ich habe eine Frage: Aus welchem ​​Grund verwenden Sie den Namespace-Operator vor ReflectionMethod? Soll sichergestellt werden, dass die Methode aus dem globalen Namespace aufgerufen wird, anstatt versehentlich eine gleichnamige Methode in einem lokalen Bereich aufzurufen? – Joey

+3

In Ihrem Fall wird es wahrscheinlich nicht benötigt. Wenn sich der obige Code in einem Namespace befindet, müssen Sie entweder die ReflectionMethod-Klasse importieren oder mit dem globalen Namespace-Präfix ('\\') darauf zugreifen. Ich stelle nur sicher, dass diese Situation behandelt wird :) –

2

Um diese Informationen zu erhalten, müssen Sie ReflectionClass verwenden. Sie könnten getMethod ausprobieren und den Klassennamen der Methode überprüfen.

Aber denken Sie daran, dass die Reflexion nicht sehr schnell ist, also seien Sie vorsichtig mit der Verwendung.

+0

In PHP 5.5.20 gab mir die '$ method ['class']': _Kann das Objekt vom Typ ReflectionMethod nicht als array_ verwenden. Die '$ method-> class' funktionierte gut. –

+0

danke - ich habe das geändert – Philipp

Verwandte Themen