Hallo,
in einem PHP Projekt habe ich einen Autoloader für Klassen gebaut. Eigentlich tut er seinen Job ganz gut und ihm ist PSR-4 auch nicht ganz fremd, aber zwei Dinge passen mir nicht.
-
Wenn ich die Klasse DingsBums suche und die Datei Dingsbums.php heißt, geht's schief, weil das Filesystem am Server case-sensitive ist. Entsprechendes gilt in den Namespaces, die ich auf Ordner mappe. Kann man mit PHP unter Linux irgendwie ein Windows-Verhalten bei der Dateisuche erreichen (sprich: case-insensitive)?
-
Wenn die Datei hugo.php nicht die Klasse hugo, sondern die Klasse otto enthält. Ist natürlich ein Programmiererfehler, aber ich würde in dem Fall doch ganz gerne eine ordentliche Fehlermeldung ausgeben und nicht mit der Nase voran in den Fatal Error Handler rennen.
Nun kann ich nach dem
require $classFile
natürlich mitclass_exists($classname)
fragen, ob die Klasse erfolgreich geladen wurde. Aber das ist nur die halbe Wahrheit, Interfaces laufen auch über den Autoloader und demzufolge muss ichclass_exists($classname) || interface_exists($classname)
fragen. Ich habe es mal eingebaut und merke auch keinen Laufzeitnachteil (was aber auch dran liegen kann, dass ich nicht hunderte von Klassen lade sondern maximal 30 oder so). Wenn ich jetzt eine Klasse nicht finde, werfe ich eine handgemachte ClassNotFoundException und fange sie in meinem Rahmen-Exceptionhandler ein, um dann eine Fehlermeldung zu präsentieren.Aber irgendwie finde ich das arg umständlich. Kann mir jemand einen Pointer auf die best-practice dazu geben? Oder mache ich genau das, was in PHP state-of-the-rubbish ist? Ich sitze btw noch auf PHP 5.6.
Rolf