17.03.2011 -

Protected Functions in vererbter Klasse über __call als Public definieren

Da wir unsere Codes mit dem Unittest-Framework PHPUnit absichern, wird für jede Klasse eine Unittest-Klassse angelegt. Nur wie komme ich da an die protected-Funktionen des Elternelements?

Früher implementierten wir jede protected-Methoden als public in der Unitest klasse und haben einfach den parent aufgerufen:

class Foo
{
    protected bar()
    {
        return "test"
    }
}

class unittestFoo extends Foo
{
    public bar()
    {
        return parent::bar();
    }
}

Bei vielen protected-Methoden wird das alles bischen Aufwändig. Jede neue Methode muss in der Unittest-Klasse nachgezogen werden, ebenso Änderungen in der Parameterisierung der Methoden.

Nun sieht unsere abgeleitete Klasse folgendermaßen aus:

class Foo
{
    protected bar()
    {
        return "test"
    }
}

class unittestFoo extends Foo
{
    public function __call($method, array $args = array()) {
        if (!method_exists($this, $method))
            throw new BadMethodCallException("method '$method' does not exist");
        return call_user_func_array(array($this, $method),$args);
       
    }
}

Mehr benötigt unsere Unittest-Klasse nicht mehr. Alle Methoden der Parent-Klasse werden automatisch eingebunden.

Der Aufruf funktioniert in der abgeleiteten Klasse ganz normal:

$fooBar = new unittestFoo();
$fooBar->bar();

© EGARA-CMS ist ein urheberrechtlich geschütztes Produkt der DREIWERKEN GmbH - Ihrer Werbeagentur für Online- und Print-Medien aus Kolbermoor (bei Rosenheim).