Globales PHP-Schlüsselwort für einen Array-Wert

Lesezeit: 3 Minuten

Benutzer-Avatar
trevdev

Hallo

Ich arbeite gerade an einem kaputten Theme, das jemand anderes für WordPress geschrieben hat. Bei einer Neuinstallation wird ein 500-Fehler ausgegeben. Nachdem ich den Code auf meinem lokalen Computer überprüft habe, kann ich Folgendes linten:

    public static function skip_script($conf) {
    $hook_suffix = isset($GLOBALS['hook_suffix']) ? $GLOBALS['hook_suffix'] : null;

    if (isset($conf['variable'])) {
        global $$conf['variable']; 
    }

    $conditions = array(
        'variable' => isset($conf['variable']) && (!isset($$conf['variable']) || !$$conf['variable']),
        'hook_suffix' => isset($conf['hook_suffix']) && (is_null($hook_suffix) || $conf['hook_suffix'] != $hook_suffix)
    );

    return in_array(true, array_values($conditions), true);
}

Darüber ärgert sich der Linter:

if (isset($conf['variable'])) {
    global $$conf['variable']; # What the heck is this?
}

Ich kann das PHP-Fehlerprotokoll überprüfen und denselben Fehler auf dem Server reproduzieren:
PHP-Parser-Fehler: Syntaxfehler, unerwartet '[', expecting ',' or ';'

This WordPress theme is known to work in the past but appears to have been abandoned over the last 3 years.

Let me get to the heart of the question: What the heck is global $$conf['variable']; tun soll. Ich gehe davon aus, dass dies ein veralteter Code ist, da er zuvor funktioniert hatte.

Benutzer-Avatar
Ethan

Das sieht aus wie eine dynamische Variable. Ich denke, es versucht, die Variable mit dem Namen von zu globalisieren $conf['variable'].

Sie können den Fehler wie folgt beheben, Sie müssen ihn nur mit geschweiften Klammern umgeben:

global ${$conf['variable']};

Dies wurde in der neueren Version von PHP 7 tatsächlich aktualisiert/geändert, wie hier zu sehen:

http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect

Änderungen an der Behandlung von indirekten Variablen, Eigenschaften und Methoden

Der indirekte Zugriff auf Variablen, Eigenschaften und Methoden wird jetzt streng von links nach rechts ausgewertet, im Gegensatz zu der vorherigen Mischung von Sonderfällen. Die folgende Tabelle zeigt, wie sich die Reihenfolge der Bewertung geändert hat.

            Old and new evaluation of indirect expressions
| Expression          | PHP 5 interpretation  | PHP 7 interpretation  |
|---------------------|-----------------------|-----------------------|
| $$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] |
| $foo->$bar['baz']   | $foo->{$bar['baz']}   | ($foo->$bar)['baz']   |
| $foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
| Foo::$bar['baz']()  | Foo::{$bar['baz']}()  | (Foo::$bar)['baz']()  |

Code, der die alte Auswertungsreihenfolge von rechts nach links verwendet hat, muss neu geschrieben werden, um diese Auswertungsreihenfolge explizit mit geschweiften Klammern zu verwenden (siehe mittlere Spalte oben). Dadurch wird der Code sowohl vorwärtskompatibel mit PHP 7.x als auch rückwärtskompatibel mit PHP 5.x.

  • Gehen global ${$$conf['variable']} hat den Fehler behoben. Ich bin mir nicht sicher, warum der Autor das tut. Ich habe etwas wiederholt, um diesen Fall im Thema zu markieren, und konnte diese Bedingung nicht eintreten lassen. Wenn dies der Fall ist, hoffe ich, dass dieser Fix das tut, was der ursprüngliche Autor beabsichtigt hat.

    – trevdev

    19. Dezember 2018 um 23:45 Uhr

  • Ja, wahrscheinlich ist es das, was sie beabsichtigt haben. PHP wurde gerade aktualisiert und dieser Code ist jetzt veraltet. Tun global ${$conf['variable']}; ist funktional gleichwertig, obwohl ich nicht glaube, dass Sie das zusätzliche Dollarzeichen benötigen $$confsollte nur einer tun 🙂

    – Ethan

    19. Dezember 2018 um 23:48 Uhr

  • Kein Problem @trevdev, helfe gerne 🙂

    – Ethan

    19. Dezember 2018 um 23:49 Uhr

1355550cookie-checkGlobales PHP-Schlüsselwort für einen Array-Wert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy