!class_exists veroorzaakt wit scherm wanneer het niet bestaat
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.
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
Wat gebeurt er als je er $viewObj::class van maakt?
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...
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.
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:
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!