2013-07-15 18 views
10

Czy można sprawdzić, czy metoda została nadpisana przez klasę potomną w PHP?Sprawdzanie php, czy metoda została przesłonięta w klasie potomnej

<!-- 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 
    } 
} 

klasa dziecka:

class bar extends foo { 
    public $goo; 

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

Kiedy iteracja tablicę obiektów zdefiniowanych jako członków tej klasy, w jaki sposób mogę sprawdzić, które z obiektów ma nową metodę, w przeciwieństwie do starego? Czy istnieje funkcja taka jak 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); 
} 

Jestem świadomy template method pattern, ale powiedzmy, że chcę sterowanie programem być oddzielone od klasy i samych metod. Aby to osiągnąć, potrzebowałbym funkcji, takiej jak method_overridden.

+0

przeciążony lub nadpisane? Myślałem, że PHP nie ma metody przeciążania –

+0

Mam na myśli nadmierne, tak – Joey

+1

Możesz spróbować tego: http://www.php.net/manual/en/reflectionclass.hasmethod.php –

Odpowiedz

16

Sprawdź, czy deklarowana klasa pasuje klasę obiektu:

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

Jest to z pewnością sposób, w jaki chcę to zrobić, ale mam pytanie: z jakiego powodu używasz operatora przestrzeni nazw przed ReflectionMethod? Czy ma to zapewnić wywołanie metody z globalnej przestrzeni nazw zamiast przypadkowego wywoływania metody o tej samej nazwie zdefiniowanej w bardziej lokalnym zasięgu? – Joey

+3

To prawdopodobnie nie jest potrzebne w twoim przypadku. Jeśli powyższy kod znajduje się w przestrzeni nazw, musisz zaimportować klasę ReflectionMethod lub uzyskać dostęp do niej z prefiksem globalnej przestrzeni nazw ('\\'). Po prostu upewniam się, że ta sytuacja jest obsługiwana :) –

2

Aby uzyskać te informacje, należy użyć programu ReflectionClass. Możesz spróbować getMethod i sprawdzić nazwę klasy metody.

$class = new ReflectionClass($this); 
$method = $class->getMethod("yourMethod"); 
if ($method->class == 'classname') { 
    //.. do something 
} 

Należy jednak pamiętać, że odbicie nie jest bardzo szybkie, więc należy zachować ostrożność przy użytkowaniu.

+0

W PHP 5.5.20 '$ method ['class']' dał mi: _Cannot użyj obiektu typu ReflectionMethod jako array_. Metoda '$ method->" działała dobrze. –

+0

dziękuję - zmieniłem to – Philipp

Powiązane problemy