Verständnisfrage: Typisierung von Parametern

deostift

Erfahrenes Mitglied
Hallo zusammen,

eine kurze Verständisfrage: Ich code PHP5 objektorientiert und möchte mich ein wenig am Zend Framework orientieren. Ich bin mir allerdings nicht sicher was ich von der Typisierung von Methoden Parametern halten soll.

Zum Beispiel:

PHP:
public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null);

Sicherlich eine feine Sache da man die Object-Übergabe erzwingt bzw. stark kontrolliert. Auch schön ist, dass die IDE in der Funktion dann die code-completion zum jeweiligen Objekt durchziehen kann, weil sie die Klasse kennt.

Ich bin allerdings bisher immer wie folgt vorgegangen:

PHP:
public function assert($acl, $role = null, $resource = null, $privilege = null);

und habe dann in der Funktion geprüft ob die Parameter die jeweiligen Klasseninstanzen sind und wenn nicht eine Exception geworfen. Ich habe so zumindest den Vorteil, dass ich kontrolliert aussteigen kann. In dem obigen Zend Beispiel wirft der PHP Interpreter einen "Fatal Error" den ich nicht sauber abfangen kann.

Meine Frage ist nun: Sollte ich hier besser Zend als Vorbild nehmen, auch wenn es unter Umständen zur Laufzeit öfters krachen kann?
 
Die Exception sollte m.E.n. nicht erst bei der Übergabe abgegeben werden, sondern bereits bei der Erstellung der Klasseninstanz. Dadurch lassen sich auch solche Fehler verhindern.
 
Das mache ich ja auch - Im Constructor prüfe ich die grundlegenden Dinge.

Allerdings hat man bei public Methoden keinen Einfluss auf die übergebenen Parameter. Das ist ja der Teufelskreis in dem ich mich hier bewege:

- Zum einen sollte beim Methoden-Aufruf sichergestellt werden, dass die zu übergebenden Parameter auch vom richtigen Typ sind (1. Prüfung seitens des Methoden-Aufrufenden)

- Zum anderen kann ich aber dann in der aufgerufenen (public) Methode ja nicht darauf vertrauen, dass die Leute auch die richtigen Typen übergeben und muss hier ebenfalls prüfen (2. Prüfung von mir in der Methode).

Die Typ-Erzwingung in den Parametern durch array oder der Klasse führt, wenn sich jemand nicht daran hält, zu einem PHP Fatal Error und somit zu einem unkontrollierten Abbruch.

@Felix: Wie gehst Du denn bei public Methoden vor? Prüfst Du alle übergebenen Parameter ob sie z.B. !is_null() , is_int() , is_array() etc.sind? Oder vertraust Du dass in der Methodenbeschreibung der Typ festgelegt ist.
 
Wenn ich mir nicht 100%ig sicher sein kann, dass ich die richtige Klasse übergeben bekomme, was allerdings selten der Fall ist, dann benutze ich keine Typisierung, sondern validiere mit [phpf]instanceof[/phpf].

Ansonsten ja, ich validiere grundsätzlich jeden Input.
 
Zurück