Page 1 of 2

Problem mit PHP 8.1.1

Posted: Fri Jun 24, 2022 8:14 am
by frase
Ich habe XH 1.7.5 mit PHP 8.1.1 installiert.
Die Korrekturen von hier sind eingearbeitet.
Neuerdings taucht aber im Adminmodus in der Vorschau folgende Debug-Meldung auf:
Debug-Mode wrote:DEPRECATED: preg_replace_callback(): Passing null to parameter #3 ($subject) of type array|string is deprecated
... \cmsimple\functions.php:242
Was könnte da los sein?

Vielleicht wichtig dazu:
In der userfuncs.php habe ich zwei Funktionen für vor-zurück die von hier stammen:
viewtopic.php?f=16&t=9400

EDIT:
Diese Funktionen sind nicht "die Schuldigen". Auch nach kompletter Entfernung bleibt die Meldung.

Re: Problem mit PHP 8.1.1

Posted: Fri Jun 24, 2022 7:23 pm
by olape
frase wrote:
Fri Jun 24, 2022 8:14 am
Ich habe XH 1.7.5 mit PHP 8.1.1 installiert.
Die Korrekturen von hier sind eingearbeitet.
Neuerdings taucht aber im Adminmodus in der Vorschau folgende Debug-Meldung auf:
Debug-Mode wrote:DEPRECATED: preg_replace_callback(): Passing null to parameter #3 ($subject) of type array|string is deprecated
... \cmsimple\functions.php:242
Was könnte da los sein?
Hm, ich hatte heute mal kurz die 1.7.5 unter PHP 8.1.6. getestet, allerdings noch ohne die bereits bekannten PHP8-Probleme zu beseitigen. Das muss ich erst mal machen. Bisher habe ich aber die von dir beschriebene Meldungen nicht dabei gehabt.

Re: Problem mit PHP 8.1.1

Posted: Fri Jun 24, 2022 7:42 pm
by frase
Ja, ich hatte das vorher auch noch nicht.
Könnte denn irgendein Plugin beteiligt sein?

Re: Problem mit PHP 8.1.1

Posted: Sat Jun 25, 2022 11:02 am
by cmb
frase wrote:
Fri Jun 24, 2022 7:42 pm
Könnte denn irgendein Plugin beteiligt sein?
Ja, durchaus möglich. Das Problem ist, dass hier das Ergebnis von eval('return ' . $___expression . ';') an preg_replace_callback() übergeben wird, und das kann NULL sein, aber ab PHP 8.1.0 darf man das nicht mehr tun. Als Quick-Fix vielleicht einfach diese Zeile ersetzen durch:

Code: Select all

eval('return ' . $___expression . ';') ?: ''
PS: wir sollten das trotzdem genauer untersuchen. Es sollte zunächst geklärt werden, ob hier eine Funktion aufgerufen wurde, die aus welchen Gründen auch immer NULL zurückgab. Falls das so ist, dann sollte eigentlich die Funktion gefixt werden (statt NULL eben eine leere Zeichenkette liefern). Da es vermutlich einige solcher Plugin-Funktionen gibt, brauchen wir natürlich trotzdem einen Workaround um das abzufangen. Aber vielleicht stimmt auch was mit dem eval('return ' . $___expression . ';') nicht.

Re: Problem mit PHP 8.1.1

Posted: Sat Jun 25, 2022 11:16 am
by frase
cmb wrote:
Sat Jun 25, 2022 11:02 am
Als Quick-Fix vielleicht einfach diese Zeile ersetzen durch:
Auf den ersten Blick hat das tatsächlich geholfen.
Keine Meldung mehr.
Ob das noch irgendwelche anderen Folgen hat, kann ich (noch) nicht beurteilen.
cmb wrote:
Sat Jun 25, 2022 11:02 am
PS: wir sollten das trotzdem genauer untersuchen. Es sollte zunächst geklärt werden, ob hier eine Funktion aufgerufen wurde, die aus welchen Gründen auch immer NULL zurückgab. Falls das so ist, dann sollte eigentlich die Funktion gefixt werden (statt NULL eben eine leere Zeichenkette liefern). Da es vermutlich einige solcher Plugin-Funktionen gibt, brauchen wir natürlich trotzdem einen Workaround um das abzufangen. Aber vielleicht stimmt auch was mit dem eval('return ' . $___expression . ';') nicht.
Dazu kann ich leider nichts sagen.
Ob hier ein Plugin im Spiel ist, hatte ich versucht zu prüfen. In dieser Installation sind allerdings mächtig viele Plugins aktiv und wenn ich einige davon deaktiviere, funktioniert die ganze Site nicht mehr. :(
Deshalb hier an dieser Stelle die Frage.

Re: Problem mit PHP 8.1.1

Posted: Sat Jun 25, 2022 1:23 pm
by cmb
frase wrote:
Sat Jun 25, 2022 11:16 am
Ob das noch irgendwelche anderen Folgen hat, kann ich (noch) nicht beurteilen.
Das sollte eigentlich keine wirklich unerwünschten Nebenwirkungen haben. Allerdings ist mir nun aufgefallen, dass eine Funktion, die ein Array zurückgibt, auch nicht korrekt behandelt wird. Da kommt es nämlich zu:
WARNING: Array to string conversion
Und im Content-Bereich steht dann "Array". Und wenn die Pluginfunktion etwas gänzlich unerwartetes zurückgibt (z.B. ein Objekt), dann kommt es zu einem fatalen Fehler. Na ja, halbwegs sinnvoll sollte sich eine Pluginfunktion schon verhalten; ich denke wir müssen hier nicht alles berücksichtigen.

Trotzdem ist zu überlegen, ob wir nicht einfach zu String casten, was vielleicht die brauchbarsten Fehlermeldungen erzeugt:

Code: Select all

(string) eval('return ' . $___expression . ';')
Oder wir erwarten von Autoren von Pluginfunktionen, dass diese keinen Unsinn zurückgeben, und berücksichtigen nur NULL explizit (aus Gründen der Kompatibilität mit bestehenden Plugins):

Code: Select all

eval('return ' . $___expression . ';') ?? ''
Das erfordert aber PHP ≥ 7.0.0.
frase wrote:
Sat Jun 25, 2022 11:16 am
Ob hier ein Plugin im Spiel ist, hatte ich versucht zu prüfen. In dieser Installation sind allerdings mächtig viele Plugins aktiv und wenn ich einige davon deaktiviere, funktioniert die ganze Site nicht mehr. :(
Wenn ich es recht bedenke, dann ist es nicht unwahrscheinlich, dass eine Pluginfunktion null zurückgegeben hatte. Ich selbst habe das, glaube ich, in einigen Plugins so gemacht, z.B. wenn die Pluginfunktion nichts sinnvolles ausgeben kann. Ist natürlich nicht wirklich korrekt, eben weil eine Pluginfunktion immer eine Zeichenkette liefern sollte (die eben auch leer sein kann). Tipp für Pluginentwickler: nutzt statische Analysetools und Typdeklarationen. Dann fällt sowas auf, bevor man das Plugin überhaupt testet.

Re: Problem mit PHP 8.1.1

Posted: Mon Jul 11, 2022 6:19 am
by jadefusion
Testing cmsimple_XH 1.75 with PHP 8.1.5 and the first php 8.1.* fix from github applied.
I embedded a script placed in the userfuncs.php file within a page. The script did not function as expected and did not display within the page. Instead it brought up a new blank page with the script result displayed. The above php error message was also shown.

On removing the script from userfuncs.php the error message was no longer displayed.

Re: Problem mit PHP 8.1.1

Posted: Mon Jul 11, 2022 11:41 am
by cmb
jadefusion wrote:
Mon Jul 11, 2022 6:19 am
I embedded a script placed in the userfuncs.php file within a page. The script did not function as expected and did not display within the page. Instead it brought up a new blank page with the script result displayed. The above php error message was also shown.
Did you echo the output, instead of returning it from the function? E.g.

Code: Select all

// bad example
function my_function() {
    echo "hello world";
}

// good example
function my_function() {
    return "hello world";
}

Re: Problem mit PHP 8.1.1

Posted: Mon Jul 11, 2022 12:04 pm
by lck
frase wrote:
Fri Jun 24, 2022 8:14 am
Ich habe XH 1.7.5 mit PHP 8.1.1 installiert.
Die Korrekturen von hier sind eingearbeitet.
Meiner Meinung ist hier die Korrektur/der Fix nicht ganz richtig, es taucht immer noch eine Meldung auf.
PluginConfig.php, Zeile 100

Code: Select all

    #[ReturnTypeWillChange]
sollte IMO auch lauten

Code: Select all

    #[\ReturnTypeWillChange]

*EDIT
Bereits korrigiert: viewtopic.php?t=18326#p83074

Re: Problem mit PHP 8.1.1

Posted: Tue Jul 12, 2022 8:51 am
by jadefusion
cmb wrote:
Mon Jul 11, 2022 11:41 am
Did you echo the output, instead of returning it from the function?
Thank you.
You have confirmed that I must use 'return'. I think I used both echo and return, however I was not worried about the script in question... It was the PHP error message that caught my attention.