class_exists() und Autoloader

0 views
Skip to first unread message

Stefan Froehlich

unread,
Jul 9, 2021, 9:07:21 AMJul 9
to
Gibt es einen denkbaren Umstand (und vor allem: welchen?), durch den

#v+
<?php class_exists($module, true) ?>
#v-

false zurückgibt, *ohne* davor die von spl_autoload_functions()
ausgegebenen Handler aufzurufen?

Nach mehreren Dutzend geladenen Klassen passiert das bei einer
bestimmten plötzlich nicht mehr, und ich habe nicht die leiseste
Ahnung, wo ich zu Suchen anfangen soll. Der Dokumentation folgend
kann nicht sein, was nicht sein darf, und doch gibt die Funktion
hier false zurück, und im Protokoll, dass der Handler direkt nach
dem Aufruf erzeugt, finden sich zwar rund 200 andere Klassennamen,
nicht aber $module.

Die Datei für $module existiert und ist syntaktisch korrekt, wobei
das keine Rolle spielen sollte, da ja nicht einmal die Datei
gesucht, geschweige denn gelesen wird.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - die zarteste Inkarnation von hinreissend!
(Sloganizer)

Stefan Froehlich

unread,
Jul 9, 2021, 11:18:51 AMJul 9
to
On Fri, 09 Jul 2021 15:07:18 Stefan Froehlich wrote:
> Gibt es einen denkbaren Umstand (und vor allem: welchen?), durch den
>
> #v+
> <?php class_exists($module, true) ?>
> #v-
>
> false zurückgibt, *ohne* davor die von spl_autoload_functions()
> ausgegebenen Handler aufzurufen?

Es gibt einen - wenn die Namespace-Trenner im Klassennamen
versehentlich "/" anstatt "\" lauten. Erstaunlich, wie viele Stunden
lang man das ausblenden kann.

Bei syntaktisch ungültigen Klassennamen wird also nicht der
Autoloader aufgerufen und auch keine Exception geworfen, sondern
class_exists() gibt einfach false zurück - steht so nicht in der
Dokumentation, ist evt. aber gut zu wissen.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - die Offerte der zärtlichen Erotik.</b
(Sloganizer)

Karl Pflästerer

unread,
Jul 10, 2021, 4:39:47 PMJul 10
to
Stefan...@Froehlich.Priv.at (Stefan Froehlich) writes:

> On Fri, 09 Jul 2021 15:07:18 Stefan Froehlich wrote:
>> Gibt es einen denkbaren Umstand (und vor allem: welchen?), durch den
>>
>> #v+
>> <?php class_exists($module, true) ?>
>> #v-
>>
>> false zurückgibt, *ohne* davor die von spl_autoload_functions()
>> ausgegebenen Handler aufzurufen?
>
> Es gibt einen - wenn die Namespace-Trenner im Klassennamen
> versehentlich "/" anstatt "\" lauten. Erstaunlich, wie viele Stunden
> lang man das ausblenden kann.
>
> Bei syntaktisch ungültigen Klassennamen wird also nicht der
> Autoloader aufgerufen und auch keine Exception geworfen, sondern
> class_exists() gibt einfach false zurück - steht so nicht in der
> Dokumentation, ist evt. aber gut zu wissen.

Das steht dort nicht explizit, aber class_exists gibt nur dann true
zurück, wenn die Zeichenkette der Name einer definierten Klasse ist.
Ansonsten false. Da man Zeichnketten übergibt kann man viele syntaktisch
ungültige Klassennamen übergeben. Es erscheint mit sinnvoll nur dann den
autoloader aufzurufen, wenn die Zeichenkette überhaupt auf eine Klasse
verweisen könnte

KP

Stefan Froehlich

unread,
Jul 10, 2021, 5:04:20 PMJul 10
to
On Sat, 10 Jul 2021 22:39:45 Karl Pflästerer wrote:
> Stefan...@Froehlich.Priv.at (Stefan Froehlich) writes:
> > On Fri, 09 Jul 2021 15:07:18 Stefan Froehlich wrote:
> >> Gibt es einen denkbaren Umstand (und vor allem: welchen?),
> >> durch den
> >>
> >> #v+
> >> <?php class_exists($module, true) ?>
> >> #v-
> >>
> >> false zurückgibt, *ohne* davor die von spl_autoload_functions()
> >> ausgegebenen Handler aufzurufen?

[...]
> > Bei syntaktisch ungültigen Klassennamen wird also nicht der
> > Autoloader aufgerufen und auch keine Exception geworfen, sondern
> > class_exists() gibt einfach false zurück - steht so nicht in der
> > Dokumentation, ist evt. aber gut zu wissen.

> Das steht dort nicht explizit, aber class_exists gibt nur dann
> true zurück, wenn die Zeichenkette der Name einer definierten
> Klasse ist. Ansonsten false. Da man Zeichnketten übergibt kann
> man viele syntaktisch ungültige Klassennamen übergeben.

Im Grund genommen ja, wobei IMO das Werfen eines Fehlers vielleicht
geschickter wäre. Wenn man wirklich mit syntaktisch ungültigen
Klassennamen arbeiten möchte, könnte man ihn ja abfangen, ansonsten
hat man aber wenigstens gleich einen Hinweis auf das Problem.

> Es erscheint mit sinnvoll nur dann den autoloader aufzurufen, wenn
> die Zeichenkette überhaupt auf eine Klasse verweisen könnte

Eh. In meinem Fall werden Views als Klassen implementiert, und in
einem Template war anstatt \Level1\Level2\Child::class versehentlich
"/Level1/Level2/Child" als String eingetragen. Das hat dann ein paar
km weiter hinten ein Problem erzeugt - und ich war zunächst so
fokussiert auf Fehler in der Modul*bezeichnung* und danach so
irritiert, dass die Datei nicht einmal gesucht wird, dass mir die
falsche Syntax schlicht nicht aufgefallen ist.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - Wer trägt heute schon Eulen nach Athen?
(Sloganizer)
Reply all
Reply to author
Forward
0 new messages