Smarty Engine rendert wit scherm bij upgrade naar PHP8.1 i.c.m. block functions
Al met al lijken we het initiële probleem dus teruggbracht te hebben tot een probleem met het automatisch inladen van classes.
Om hier zeker van te zijn kun je voor de betreffende code de betreffende class eens inladen en kijken of ie het dan wel doet:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag);
if (class_exists($class_name)
&& (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))
) {
self::$_tag_objects[ $tag ] = new $class_name;
} else {
self::$_tag_objects[ $tag ] = false;
}
if (class_exists($class_name)
&& (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))
) {
self::$_tag_objects[ $tag ] = new $class_name;
} else {
self::$_tag_objects[ $tag ] = false;
}
Dat betekent dus, als de class niet gevonden wordt stelt ie de var "self::$_tag_objects[ $tag ]" in op false. Waarna de rest van de code wordt uitgevoerd. Ik wíl dus dat ie dat ook doet. Dat ie de "ELSE" uitvoert, want die class bestaat terecht niet. Dat is normaal.
Maar hij kómt niet in de else, omdat de function "class_exists()" de hele PHP uitvoer laat klappen. De hele code compilatie vna PHP stopt als class_exists de class niet kan vinden. Dat is niet normaal. Het hoort dan gewoon een "false" terug te geven ipv vast te lopen.
Probleem anders beschreven:
Code (php)
1
2
3
4
5
2
3
4
5
if (class_exists('niet_bestaande_class') === false) {
echo 'class bestaat niet';
} else {
echo 'class bestaat wel';
}
echo 'class bestaat niet';
} else {
echo 'class bestaat wel';
}
Verwacht resultaat:
'class bestaat niet' wordt weergegeven.
Werkelijk resultaat:
Ik zie niets. Witte pagina. PHP code klapt eruit/hangt.
Overigens voor jouw beeldvorming, dit...
...is wat ik 'dode code' noem. Het 'do anything' wordt nooit uitgevoerd, omdat het in een 'if false' staat. Dat is nooit true.
Dank!
Gewijzigd op 01/06/2022 09:56:42 door Maarten Baars
>> ...is wat ik 'dode code' noem.
Dat was ook exact de bedoeling ;-)
De vraag was of als je die class_exists functie er (tijdelijk) even tussenuit haalt, of ie dan wel doet wat je verwacht. Hij zou dan direct door moeten gaan naar jouw eigen code. Dit om uit te sluiten dat het probleem in jouw eigen code zit.
Ik heb overigens vrij gedetailleerd nu de oorzaak gevonden. Nog niet de exacte code, maar wel welke module precies. Onze applicatie gebruikt een...hou je vast...16 jaar oude 3rdParty module van een developer die zelf ook aan de applicatie heeft gewerkt. Zodra die module wordt "geinclude" werkt class_exists() niet meer. Als ik die module skip, doet alles het weer, maar ik ben niet zeker van of ook echt alles het doet. Straks wordt die 'crudder' module toch ergens nog gebruikt en is het vitaal voor bepaalde delen van onze app.
Er is zelfs op deze website gepubliceerd door de developer over deze module:
https://www.phphulp.nl/php/script/snippets/crudder/1497/
Ik heb een PHP Storm "Code Inspection" uitgevoerd.
533 PHP errors
918 General errors
En nog veel meer.
Ik ga me bezinnen, maar helaas kan ik hier niet een detail weergeven van déze specifieke code veroorzaakt het. Mocht ik nog wat nuttigs ontdekken, dan meld ik het wel. Mocht iemand hier nog ideeën hebben hoe hiermee om te gaan, dan mag je altijd reageren natuurlijk. Ik houd deze thread nog wel even bij.
Bedankt allen.
Toevoeging op 01/06/2022 12:03:29:
Crudder importeert "phpdocx_free", dus nog gedetailleerder: het ligt dááraan. Als ik de crudder module aanpas zodat ie deze module skipt doet ie het ook.
Dan dus even alles nalopen en controleren of die module ergens werd gebruikt. Zo niet, dan uitschakelen en probleem opgelost.
De "Crudder" includeerde een andere module, namelijk "phpdocx_free". Die registreerde ook enkele autoload functies. Daarin staan PHP5 notaties die dus in PHP8 fatal errors veroorzaken (zoals curly braces). Alleen...die module zette errornotaties uit met eigen code. Dus op de DEV veroorzaakte dat wel een error, maar dat zag je niet. En die error werd alleen veroorzaakt, als je de code ook actief maakte door.......de autoload af te vuren met "class_exists()".
Dus zodra je een class_exists() deed en de class werd niet gevonden, vuurde hij ook de autoloads af van "phpdocx_free" waarin fatal errors voorkwamen. Die zag je niet, want errors stonden in die module uit en dus had je een wit scherm.
Bedankt allen. Nu hoef ik echt geen hulp meer hier. Het is nu een kwestie van...hebben we crudder en phpdocx_free nodig of niet. Want updaten van die modules kan niet, ze zijn inmiddels overleden.
Groetjes en out!