Seite 1 von 2

PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 10:20
von achiboy
Können wir hier die offenen Kompatibilität-Probleme bekanntgeben und gemeinsam lösen?

Bis jetzt habe ich folgende Fehler gefunden, die in GIT noch nicht behoben sind:
  • includes\include.frontend.user_edit.php
    => $messages = array(); von Zeile 98 auf Zeile 92 verschieben
  • includes\include.frontend.group_edit.php
    => $messages = array(); von Zeile 92 auf Zeile 91 verschieben
  • includes\include.upl_dirs_overview.php
    => $failedFiles = array(); von Zeile 89 auf Zeile 88 verschieben
  • includes\include.str_overview.php (z.B. Kategorieübersicht anzeigen)
    => Zeile 647: strlen anstatt sizeof verwenden
    => Zeilen 279+280 ersetzen durch ???? (habe bisher keine Lösung wegen rekursivem Aufruf)
  • includes\include.upl_files_overview.php
    => Zeile 398 ändern in
    $sCacheName = substr($sCacheThumbnail, strrpos($sCacheThumbnail, '/') + 1, strlen($sCacheThumbnail) - strlen(strrchr($sCacheThumbnail, '/')) + 1);
Noch nicht beheben konnte ich folgende Fehler:
  • Artikel editieren / im Frontend surfen
    PHP Deprecated: The each() function is deprecated. This message will be suppressed on further calls in \contenido\plugins\smarty\smarty_source\sysplugins\smarty_internal_compilebase.php on line 75
  • Kategorieübersicht anzeigen
    PHP Deprecated: The each() function is deprecated. This message will be suppressed on further calls in \contenido\includes\include.str_overview.php on line 279
    => Lösungsversuche siehe hier viewtopic.php?f=98&t=43207&p=178738#p178738

Re: PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 10:59
von Faar
Artikelübersicht anzeigen
In der Funktion getAllValues() wird auth=NULL als parameter zugewiesen aber sizeof() ist im Prinzip count() und das erwartet ein Objekt oder Array.
auth=null ist hier also falsch, es sollte wohl auth=array() heißen.
Oder man splittet das in zwei Schritte auf:

Code: Alles auswählen

if (!is_null($auth) && sizeof($auth) > 0) {
wird zu
if (is_array($auth) || is_object($auth)){
   if(count($auth) > 0) {
   ...
Das Problem wird vermutlich aber viel früher schon irgendwo sein, wo nicht klar ist, ob $auth ein String, oder Array oder Objekt ist.

Re: PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 11:18
von Faar
Artikel editieren / im Frontend surfen
so sieht es aus in Zeile 75:

Code: Alles auswählen

$kv = each($mixed);
Kann man vielleicht so schreiben:

Code: Alles auswählen

foreach($mixed as $key => $value) {
   $kv=array();
   $kv['key'] = $key;
   $kv['value'] = $value;
   ...
   ...
 }

Re: PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 12:17
von achiboy
Faar hat geschrieben:
Fr 6. Jul 2018, 10:59
Artikelübersicht anzeigen
In der Funktion getAllValues() wird auth=NULL als parameter zugewiesen aber sizeof() ist im Prinzip count() und das erwartet ein Objekt oder Array.
auth=null ist hier also falsch, es sollte wohl auth=array() heißen.
Oder man splittet das in zwei Schritte auf:

Code: Alles auswählen

if (!is_null($auth) && sizeof($auth) > 0) {
wird zu
if (is_array($auth) || is_object($auth)){
   if(count($auth) > 0) {
   ...
Das Problem wird vermutlich aber viel früher schon irgendwo sein, wo nicht klar ist, ob $auth ein String, oder Array oder Objekt ist.
Danke für die Idee. Ich habe das jetzt so gelöst:

Code: Alles auswählen

        if (is_array($auth) || $auth instanceof Countable) {
			if (count($auth) > 0) {
				$authString .= " AND author = '" . $this->db->escape($auth->auth["uid"]) . "'";
			}
        }

Re: PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 12:35
von Oldperl
Servus,
Faar hat geschrieben:
Fr 6. Jul 2018, 11:18

Code: Alles auswählen

foreach($mixed as $key => $value) {
   $kv=array();
   $kv['key'] = $key;
   $kv['value'] = $value;
   ...
   ...
 }
Warum initialisierst Du eigentlich bei jedem Schleifendurchlauf das Array neu, so hast Du immer am Ende nur die letzte Schleife im Array.

Gruß aus Franken

Ortwin

Re: PHP 7.2 Kompatibilität

Verfasst: Fr 6. Jul 2018, 13:10
von Faar
Oldperl hat geschrieben:
Fr 6. Jul 2018, 12:35
Servus,
Warum initialisierst Du eigentlich bei jedem Schleifendurchlauf das Array neu, so hast Du immer am Ende nur die letzte Schleife im Array.
Gruß aus Franken
Ortwin
Damit es immer schön sauber ist 8)

Nein, Spass beiseite, ich habe nicht geschaut, ob man am Ende der Schleife das Array noch braucht.
Ich habe nur diese Zeile betrachtet und da kein Zähler im Array ist, wird es sinnvollerweise nur einen Schlussel und einen Wert geben.
Dadurch habe ich eine Bestimmtheit, was im Array ist und auf diese Weise zugewiesen wird.
Es findet ja nur ein Austausch statt und dafür ist es gut, wenn das Array bei jedem Druchlauf jungfräulich ist.

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 06:45
von achiboy
Ich habe mich an die class.session.php herangewagt.
Mit diesem Code ab Zeile 225 kommt bei mir das selbe heraus:

Code: Alles auswählen

            case 'array':
                // $$var is an array. Enumerate the elements and serialize them.
                $str .= "\$$var = array(); ";
                eval("\$l = array(); foreach(\$$var as \$k => \$v) {\$l[] = array(\$k,gettype(\$k),\$v);}");
                foreach ($l as $item) {
                    // Structural recursion
                    $this->_rSerialize($var . "['" . preg_replace("/([\\'])/", "\\\\1", $item[0]) . "']", $str);
                }
                break;
Mich erstaunt es ein wenig, weil ich nicht mehr auf den Typ "array" abfrage, aber es funktioniert.

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 06:47
von achiboy
Ist dieser Thread eigentlich für das Contenido-Team von Interesse?
Ich hoffe ja schon, dass diese oder ähnliche Lösungen im Core eingepflegt werden...

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 07:21
von achiboy
und nun zur include.str_overview.php.
hier habe ich folgende Änderungen gemacht:

Zeile 279 alt

Code: Alles auswählen

    while ($item_list = each($items)) {
        list($key, $item) = $item_list;
Zeile 279 neu

Code: Alles auswählen

    while ($item = array_shift($items)) {
Zeile 343 alt

Code: Alles auswählen

        if (array_key_exists($key + 1, $items)) {
            $nextItem = $items[$key + 1];
Zeile 343 neu

Code: Alles auswählen

        if (array_key_exists(0, $items)) {
            $nextItem = $items[0];

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 08:36
von Faar
achiboy hat geschrieben:
Di 10. Jul 2018, 06:47
Ist dieser Thread eigentlich für das Contenido-Team von Interesse?
Ich hoffe ja schon, dass diese oder ähnliche Lösungen im Core eingepflegt werden...
Der Thread wird beobachtet.

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 12:20
von Oldperl
Faar hat geschrieben:
Di 10. Jul 2018, 08:36
Der Thread wird beobachtet.
:shock: Sag nur! Hätte ich das gewusst... :roll: 8)

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 17:16
von xmurrix
Hallo achiboy,

danke für die Zusammenstellung der offenen Fehler.

Ich kann die hier beschriebenen Ansätze zur Lösung der Fehler gerne in Git pushen. Einiges ist schon gefixt/angepasst, überall wurde die Verwendung von each() gegen Alternativen ersetzt.

Die einzige Stelle, die noch each() verwendet, ist die Session. Da war meine Idee, auch das eval() zu entfernen, allerdings hat mein Ansatz nicht funktioniert. Bin aber auch nicht dazugekommen, mit mehr mit dem Problem zu beschäftigen.

Der Lösungsversuch in viewtopic.php?f=98&t=43207&p=178736#p178735 scheint sehr gut zu sein, das sollte man sich genauer ansehen.

Gruß
xmurrix

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 17:31
von xmurrix
achiboy hat geschrieben:
Di 10. Jul 2018, 06:45
Ich habe mich an die class.session.php herangewagt.
Mit diesem Code ab Zeile 225 kommt bei mir das selbe heraus:

Code: Alles auswählen

            case 'array':
                // $$var is an array. Enumerate the elements and serialize them.
                $str .= "\$$var = array(); ";
                eval("\$l = array(); foreach(\$$var as \$k => \$v) {\$l[] = array(\$k,gettype(\$k),\$v);}");
                foreach ($l as $item) {
                    // Structural recursion
                    $this->_rSerialize($var . "['" . preg_replace("/([\\'])/", "\\\\1", $item[0]) . "']", $str);
                }
                break;
Mich erstaunt es ein wenig, weil ich nicht mehr auf den Typ "array" abfrage, aber es funktioniert.
Das macht einen guten Eindruck, da wird ein neues Array erstellt und für jeder Eintrag die $this->_rSerialize() aufgerufen. Habe das zwar nicht getestet, aber das sollte so Funktionieren.

Meine Idee var die Verwendung der in PHP vorhandenen Funktion serialize(), um damit die in der Session zu speichernden globalen Variablen zu serialisieren und in $_SESSION zu speichern. Problematisch könnte es mit Objekten werden, also mit Auth, Perm oder anderen Objekten, die man danach eventuell nicht sauber wiederherstellen kann.

Gruß
xmurrix

Re: PHP 7.2 Kompatibilität

Verfasst: Di 10. Jul 2018, 21:21
von xmurrix
Folgende Dateien wurden vorhin angepasst und in Git gepusht:
- class.session.php
- include.frontend.group_edit.php
- include.frontend.user_edit.php
- include.str_overview.php
- include.upl_dirs_overview.php
- include.upl_files_overview.php

Andere Dateien/Bereiche, die in diesem Thema angemerkt sind, wurden schon vorher bearbeitet. Somit sollten alle Punkte aus diesem Thema abgearbeitet sein, auch das Problem mit der Session und der rekursive Aufbau der Kategorien in include.str_overview.php.

Bitte an alle beteiligten, die Änderungen auch unter euren Umgebungen zu prüfen, bei mit in Windows 10 mit PHP 7.2.6 läuft das alles wie gewünscht.

Grüße
xmurrix

Re: PHP 7.2 Kompatibilität

Verfasst: Do 9. Aug 2018, 17:57
von mikedreissig
Hallo,

das klingt super, nur wie kommt man an die angepasste Version im GIT heran? Gibt es dort irgendwo auch eine Möglichkeit zum Download?

Grüße mike