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();