Diese Woche konnte ich eine neue Erkenntnis über die Interfaces von PHP5 erhalten.
Ich bin immer davon ausgegangen, dass die Interfaces in PHP5 sehr strikt gehandhabt werden.
Als ich im Code der Zend Framework Form Komponente stöberte fiel mir auf, dass innerhalb
der Formular Elemente beim Validieren von Daten die isValid Methode der Validatoren aufgerufen
wurden. Soweit nichts besonderes. Die Zend Validatoren implementieren das Interface
Zend_Validate_Interface. Diese gibt genau drei Methode vor, die zu implementieren ist.
Unteranderem die besagte “isValid” Methode die in den Formularen genutzt wird.
Diese Methode hat die folgende Signatur.

public function isValid($value);

Wie man erkennen kann wird genau ein Parameter übergeben. Würde man einen zweiten Parameter
übergeben würde dies zu einem “Fatal Error” führen, da das Interface anders definiert wurde.
Doch was mich nun wunderte war, dass innerhalb der Formular-Validierung einfach zwei Parameter
an isValid übergeben wurden. Nach einem kleinen Testprogramm musste ich feststellen, dass PHP
in keiner Weise streng mit den Parametern umgeht. Sobald weitere Parameter folgen und diese mit
einem Wert vorbelegt sind ignoriert PHP diese.

Beispiel:

public function isValid($value, $foo = null, $bar = 123);

Die PHP Core-Entwickler haben sich diese krücke wohl gebaut da PHP keine Polymorphie unterstützt.
Dies ist schlecht da man sich so nicht 100% auf die Interfaces verlassen kann. Die grundsätzlichen
Parameter sind dann zwar vorhanden, aber die Sub-Klassen können bei bedarf weitere Parameter übergeben bekommen.
Das ist aus meiner Sicht wirklich inkonsistenz. Aber darüber lässt sich sicherlich streiten.
Gleiches gilt auf die Workarounds zum Nachbilden von Polymorhie mittels der PHP Funktion
func_get_args

Hoffen wir auf PHP 5.3 - Vielleicht tut sich hier noch ein wenig.