Frage

Ich habe gerade auf PHP 5.3 aktualisiert und begonnen, eine alte Website für einen neuen Kunden zu unterstützen. Es scheint einen ziemlich seltsamen PHP -Code zu verwenden, auf den ich vorher noch nicht gestoßen bin.

Während der Versuch, auf $ _get oder $ _Request -Variablen zuzugreifen, hat der Entwickler Folgendes verwendet: $ {"variable_name"}

Ich erhalte Hinweise, die aufgrund von undefinierten Variablen generiert werden (vermutlich, weil PHP das nicht analysiert $ {"variable_name"} Stilcode).

Ändern dies in $ _Request ['variable_name' Funktioniert wie erwartet, aber ich kann nicht den gesamten Code durchgehen und ihn ändern, da die Website massiv ist und proprisiger Layoutmethoden verwendet.

Weiß jemand, ob es möglich ist, die Unterstützung für diese Tags / Codeblocks einzuschalten? Ich habe einen Blick in Php.ini geworfen und es wird ASP -Style -Tags und kurze Tags erwähnt, aber es hat keine Wirkung (sie sehen sowieso ganz anders aus, ich dachte nur, es war einen Schuss wert).

War es hilfreich?

Lösung

Ich glaube nicht, dass diese Syntax etwas Neues gibt:

$a = 10;
var_dump(${"a"});

Funktioniert gut ;-)


Ihr Problem ist wahrscheinlich darauf zurückzuführen, dass zuvor, vorher, register_globals wurde aktiviert (Standardmäßig, wenn Php <= 4. etwas), und ist jetzt behindert - und das ist gut für die Sicherheit!

Mit Register_Globals auf eins, jede Variable in $_REQUEST wird automatisch als vartierbar in Ihrer Anwendung injiziert - Nun, eigentlich hängt das von der ab variables_order Konfigurationsoption, aber diese beinhaltet zumindest fast immer Get, Post und Cookie.

Zum Beispiel, wenn es eine Variable wie gibt $_GET['my_var'], Sie werden auch eine haben $my_var Variable ... und auf diesen kann auch mit der Syntax zugegriffen werden ${'my_var'}


In Anbetracht register_globals ist Off Standardmäßig seit so etwas wie Php 4.2 und sollte in Php 6 verschwinden (wenn ich mich richtig erinnere), Ich würde mich von der erneuten Aktivierung von es raten ... zumindest, wenn Sie die Zeit haben, um den Code zu korrigieren / zu testen ...

Andere Tipps

Die Curly -Brace -Syntax für Variablen ist ein eingebetteter Teil von PHP und gibt es schon eine ganze Weile. Der Grund, warum es existiert variable Variablen.

Aus dem Handbuch:

Um variable Variablen mit Arrays zu verwenden, müssen Sie ein Unklarheitsproblem beheben. Das heißt, wenn Sie $$ a schreiben1 Dann muss der Parser wissen, ob Sie $ A verwenden möchten1 als Variable oder wenn Sie $$ a als Variable und dann die gewünscht haben 1 Index aus dieser Variablen. Die Syntax zur Lösung dieser Mehrdeutigkeit lautet: $ {$ a1} für den ersten Fall und $ {$ a}1 für die zweite.

Es ist eine sehr praktische Syntax in mehreren Situationen, z. B. die Verwendung von Array- oder Objektvariablen, während Sie etwas ausgeben Heredoc -Syntax.

Ich werde den Rat von anderen über die Verwendung nicht wiederholen register_globals, Ich wollte nur diese ungewöhnliche Syntax erläutern.

Die Syntax $ {"variable_name"} ist praktisch gleich wie $ variable_name, außer dass der Inhalt der lockigen Klammern zuerst ausgewertet wird. Es wird von allen neueren Versionen von PHP unterstützt, sogar von den Beta -Versionen. Was jedoch nicht von den jüngsten Versionen von PHP unterstützt wird, ist die Unterstützung der Registrierung von $ _Request (und anderen) Variablen als globale Variablen. Es gibt eine Einstellung, um es zu aktivieren:

register_globals = on

Es wird jedoch aufgrund von Sicherheitsproblemen jedoch nicht für die Verwendung von Produktionsnutzungen empfohlen. Es kann einfacher sein, Sie durch ein "Sed'-ähnliches Werkzeug" zu führen und die Verwendung durch regelmäßige Ausdruck zu ersetzen.

Der alte Server hat wahrscheinlich REGISTER_GLOBALS an. Die seltsamen Klammern sind also nicht das Problem.

REGISTER_GLOBALS stellt alle Variablen ein $_REQUEST Als reguläre Variablen im globalen Bereich, dh Sie können zugreifen $_REQUEST['test'] kann zugreifen wie wie $test oder ${"test"}

Die Klammersyntax ist standardmäßig eingeschaltet, und ich glaube nicht, dass Sie sie ein-/ausschalten können.

register_globals wurde wahrscheinlich eingeschaltet. {$variable_name} Syntax ist immer eingeschaltet, aber register_globals dreht Dinge wie $_REQUEST['variable_name'] hinein $variable_name.

Vermeiden Sie es jedoch, es aufzuschalten, wenn möglich - es gibt einen Grund, warum es lange geraten wurde, und es geht ganz in PHP6 aus.

register_globals wird ab PHP 5.3 veraltet und wird ab PHP 6.0 entfernt. Was Sie tun möchten, ist die Refactoring -Funktion in den meisten PHP -IDEs (Zendo Studio 6+) zu verwenden, um die Variable in etwas angemessenerem zu benennen, dh dh dh dh $_GET['variable_name'].

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top