Smarty Engine rendert wit scherm bij upgrade naar PHP8.1 i.c.m. block functions

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Ozzie PHP

Ozzie PHP

31/05/2022 15:27:26
Quote Anchor link
Dan kun je óf de betreffende class van tevoren al inladen (via require), of je moet een 2e (jouw eigen) autoload functie registreren. Die wordt dan aangeroepen als de eerste autoload functie geen resultaat oplevert.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

require 'pad/naar/jouw/plugin';
$class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag);

?>
 
PHP hulp

PHP hulp

24/04/2024 21:44:03
 
Maarten Baars

Maarten Baars

31/05/2022 15:44:02
Quote Anchor link
Ik denk niet dat ik helemaal duidelijk ben geweest. Laat me even de volledig code plaatsen waar het om gaat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if (class_exists('niet_bestaande_class') === false) {
    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.
 
Ozzie PHP

Ozzie PHP

31/05/2022 16:01:50
Quote Anchor link
Doet ie het zo wel?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

$class_name
= 'Smarty_Internal_Compile_' . implode('_', $_tag);
if (false) {
    self::$_tag_objects[ $tag ] = new $class_name;
}
else {
    self::$_tag_objects[ $tag ] = false;
}


?>
 
Maarten Baars

Maarten Baars

01/06/2022 09:56:19
Quote Anchor link
In je code staat nergens een class_exists(). Het moet met class_exists() werken, want het gaat hier om 3rd Party code van Smarty Engine. Ik kan niet in die code gaan lopen wroeten.

Overigens voor jouw beeldvorming, dit...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if (false) {
  // do anything
}


...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
 
Ozzie PHP

Ozzie PHP

01/06/2022 10:43:08
Quote Anchor link
>> In je code staat nergens een class_exists().

>> ...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.
 
Maarten Baars

Maarten Baars

01/06/2022 11:51:31
Quote Anchor link
Aha! Duidelijk. Ja, ik wist al dat de code het zou doen als ik dat probleem zou omzeilen. Maar goed.

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.
 
Ozzie PHP

Ozzie PHP

01/06/2022 12:44:00
Quote Anchor link
Haha, nou je bent in ieder geval toch weer een stukje verder gekomen :-)

Dan dus even alles nalopen en controleren of die module ergens werd gebruikt. Zo niet, dan uitschakelen en probleem opgelost.
 
Maarten Baars

Maarten Baars

01/06/2022 12:52:58
Quote Anchor link
Sorry voor de vele updates maar hier is de precieze reden van het breken van class_exists().

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!
 

Pagina: « vorige 1 2



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.