Eine Fortsetzung des vorherigen Postings bezüglich automatischer
Code-Prüfung: Bis dato habe ich Klassen-, Konstanten- und
Methodennamen geprüft, indem ich einen ggf. aktiven Namespace vor
den Namen gehängt (=> $fqcn) und dann wahlweise eine dieser drei
Prüfungen durchgeführt habe, wobei $identifier die im Quelltext
gefundene Konstante oder Methode benennt.
is_subclass_of($fqcn, 'dummy');
constant("$fqcn::$identifier");
method_exists($fqcn, $identifier);
Das läuft seit Jahren und hat sich als hilfreich erwiesen. Ein
bisher ignoriertes Manko ist, dass ggf. vorhandene use-Anweisungen
nicht berücksichtigt werden - kommt bei mir nur an wenigen Stellen
vor und war daher nie wirklich dringend.
Die Idee war, die aktuelle Umgebung als String zusammenzustellen und
dann mit eval() zu prüfen, d.h. für Klassenbezeichner sinngemäß:
#v+
$eval = $this->createCurrentNamespace();
$eval .= $this->createUseEnvironment();
$eval .= sprintf('("dummy" instanceof %s);', $fqcn);
eval($eval);
#v-
Funktioniert gut - spricht mein ans Ende der Chain gehängter
Autoloader an, wurde die Klasse nicht gefunden => Fehler.
Gleiches mache ich für Konstanten, dort mit einer Zuweisung,
funktioniert ebenfalls gut:
#v+
$eval .= "\n" . sprintf('$dummy=%s::%s;', $fqcn, $identifier);
#v-
Nur bei den Methoden bin ich ratlos: Der einzige Ansatz, der mir
bislang einfällt ist ein Aufruf:
#v+
$eval .= "\n" . sprintf('$dummy=%s::%s();', $fqcn, $identifier);
#v-
Fehler wegen falscher Parameter lassen sich abfangen, mich
interessiert dzerit nur die Existenz. Aber: dummerweise rufe ich die
Methode damit auch auf, was in einigen Fällen absolut unerwünscht
ist (und sei es nur, weil die Methode mit "die," verendet und damit
auch das Prüfprogramm in den Abgrund reisst).
Wie also tue ich so, als ob ich eine (statische) Methode aufrufe,
ohne das dann tatsächlich zu tun? Bzw. lassen sich die
use-Statements irgendwie doch beim Aufruf von method_exists()
berücksichtigen (IMO nicht, weil die Aliases ja schon beim
compilieren aufgelöst werden)?
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Eleganz ohne Grenzen - drücken mit Stefan!
(Sloganizer)