!class_exists veroorzaakt wit scherm wanneer het niet bestaat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Maarten Baars

Maarten Baars

07/04/2022 11:34:33
Quote Anchor link
Goedendag!

Ben bezig om oude 7.2 code om te zetten naar PHP 8.1, maar dat gaat niet van een leien dakkie. Kom nu een fout tegen die ik echt niet snap. Hopelijk heeft iemand hier wat meer inzicht.

Het gaat om een bestand, ergens in de core van het framework. Wat het allemaal doet is lastig uit te leggen; de code is oud en behoorlijk veel spaghetti. Maar op een gegeven moment gaat hij VIEW-classes verzamelen. Daaarbij controleert hij via een string variabele of de class bestaat of niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if (!class_exists($viewObj)) {
    // do something
}


Het 'do something' gedeelte is niet belangrijk. Punt is dat wanneer de class bestaat, de code vrolijk doorgaat. Maar op een gegeven moment komt er een classnaam binnen die niet bestaat en dan stopt de gehele code en blijft het scherm wit. Dat gebeurt echt op het punt van de if.

- $viewObj is altijd een string
- display_error staat op 1
- error_reporting op E_ALL
- Als ik express op die plek een WARNING veroorzaak, zie ik het verschijnen, dus error reporting lijkt écht te werken

Wanneer ik een stand alone php bestandje aanmaak in de rootmap van de applicatie (sandbox.php) en ik doe exact hetzelfde met exact dezelfde classnaam, dan gaat het wél goed.

Concluderende vraag
Waarom gaat class_exists bij een niet bestaande class fout zonder melding in een bestand in de core, maar gaat dat wél goed in de rootmap?

Bedankt allemaal.
Gewijzigd op 07/04/2022 11:35:36 door Maarten Baars
 
PHP hulp

PHP hulp

20/04/2024 18:30:07
 
Ward van der Put
Moderator

Ward van der Put

07/04/2022 12:04:40
Quote Anchor link
Wat gebeurt er als je er $viewObj::class van maakt?
 
Maarten Baars

Maarten Baars

07/04/2022 12:11:12
Quote Anchor link
Hey Ward

Bedankt voor je reactie. $viewObj is een string. Ja, benaming is bout, als veel andere code in deze applicatie. Maar we doen het er maar even mee.

Dus het is in feite niet zo dat op een gegeven moment deze functie een object meekrijgt en daarom een fout veroorzaakt.

Hoe werkt class_exists onder water eigenlijk? Als de class niet gevonden kan worden, zoekt hij dan steeds verder in de diepte waardoor hij bijvoorbeeld op een punt komt waar hij geen rechten heeft en dan dus hangt?

Alsnog raar dat als ik deze code simuleer in die sandbox.php dat het dan wel goed gaat...
 
Ward van der Put
Moderator

Ward van der Put

07/04/2022 12:22:57
Quote Anchor link
class_exists heeft inderdaad een paar (soms vervelende) eigenaardigheden.

class_exists kan bijvoorbeeld niet uit de voeten met aliassen. Na use foo\bar as qux is class_exists('qux') daardoor false ook al kun je gewoon de class qux gebruiken.

In jouw geval vermoed ik dat dit probleem ontstaat door namespaces en/of autoloading: je moet in class_exists de class inclusief de volledige namespace noemen.
 
Maarten Baars

Maarten Baars

07/04/2022 14:24:34
Quote Anchor link
Hey Ward

Autoloading is de boosdoener. Nou, wellicht niet de autoloading, maar ehm...ik heb nog even een RTFM gedaan. Ja ja, mijn fout hoor. Maar je hint hielp me. Op de PHP.net website staat dat als ie de class niet kan vinden, hij een autoload doet. Doe ik het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if (!class_exists($viewObj, false)) {
    // do something
}


Dan komt ie wel verder. Hij doet dan geen autoload en dan geeft ie wel een false terug en gaat ie verder met de rest van de code.

Bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.