Gibt es gute Anwendungsfälle für variable Variablen?

8

Heute bin ich auf dieses kleine PHP-Juwel namens variable Variablen gestoßen .

$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"

Gibt es tatsächlich Anwendungsfälle für diese Sprachfunktion?

miku
quelle
1
Wie bei den meisten "obskuren Tricks" sind die tatsächlichen Anwendungsfälle sehr begrenzt. Es gibt normalerweise viel sauberere Möglichkeiten, diese Anwendungsfälle zu implementieren, und selbst wenn der Anwendungsfall perfekt zum Trick passt, ist es schwierig, ihn beizubehalten.
Joachim Sauer
1
@JoachimSauer Es ist nicht wirklich dunkel, variable Variablen sind das Herzstück von foreach-Schleifen.
Yannis

Antworten:

15

Angenommen, eine URL von http://example.com/hello/worldund die folgenden .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?/$1 [L]

router.php, ein zu simpler Router, wäre:

<?php

$request = explode("/", $_SERVER["REQUEST_URI"]);

$controllerClass = $request[0];
$controllerActionMethod = $request[1];

$controller = new $controllerClass();
$controller->$controllerActionMethod(); // hello::world();

?>

Das ist eine ziemlich übliche praktische Verwendung variabler Variablen. Ordentlicher Trick, aber Sie sollten äußerst vorsichtig sein, wenn Sie ihn verwenden. Übermäßiger / Missbrauch führt mit Sicherheit zu schrecklich nicht wartbarem Code.

Haftungsausschluss: Der in der Antwort angegebene Code soll nur die Verwendung der Funktion veranschaulichen. Es behandelt nicht das richtige Design, die Sicherheit, die Wartbarkeit oder die Vernunft. Verwende nicht.

Yannis
quelle
9
Haftungsausschluss: Der in der Antwort angegebene Code soll nur die Verwendung der Funktion veranschaulichen, sonst nichts. In Bezug auf die Qualität ist es absolut Mist, nicht verwenden.
Yannis
(PHP-Neuling hier) Ich sehe nicht, wo genau Sie die variablen Variablen verwendet haben, ich sehe nur einzelne Dollars. Ich vermute, es hat mit dem zu tun .htaccess, aber ich verstehe das auch nicht gut.
Manishearth
3
@YannisRizos - In Ihrem Beispiel wird ein variabler Methodenname verwendet, keine variable Variable. Es ist ganz anders. Sie rufen eine Methode effektiv über Reflexion auf und nicht eine Variable durch Reflexion.
Jonno
1
@Jonno Heh, ich dachte genau das gleiche, als mir jemand zum ersten Mal Variablenvariablen erklärte;) Die erste "Variable" bezieht sich jedoch auf die dynamische Natur der (zweiten) Variablen (der Struktur), und ihre Methode wird dynamisch referenziert. und das war's auch schon. $controller ist eine Variable (die Struktur), aber was sie enthält, wird dynamisch gesetzt, also eine variable Variable. Ein dummer Name, nicht wahr?
Yannis
1
@YannisRizos - Ich würde respektvoll widersprechen. Eine Variablenvariable ist genau die Variable, die im Umfang des korrekt erstellten Codes erstellt wird. Sie rufen hier eine Methode auf, deren Name durch eine Variable definiert wird. Nach dieser Logik ist jede Verwendung einer 'Variablen', um etwas zu tun, was ... 'variiert', eine variable Variable.
Jonno
8

Ehrlich? In fast 10 Jahren PHP-Erfahrung bin ich nie auf ein Problem gestoßen, bei dem die einzige Lösung (oder tatsächlich die beste Lösung aus einer Auswahl) darin bestand, eine variable Variable zu verwenden. Das nächste, was ich habe, ist der Zugriff auf Konstanten in einer Instanz einer Klasse wie $classInstance::CLASS_CONSTANT(die seit PHP 5.3 verfügbar ist), und selbst dann habe ich normalerweise nicht viel Verwendung dafür.

Ich vermute, es ist eine der vielen Warzen in PHP, die zu dieser Zeit eine gute Idee zu sein schienen.

Als Antwort auf Ihre Frage habe ich sie nicht gesehen, wenn es Anwendungsfälle gibt, in denen es die beste oder einzige Lösung für ein bestimmtes Problem ist.

GordonM
quelle
Das gleiche gilt hier - in sieben Jahren, in denen ich mit PHP gearbeitet habe, bin ich nie auf vv gestoßen (im Produktionscode sowieso).
Miku
Variable Variablen mögen wie ein ordentlicher Trick erscheinen, aber dann werden Sie (oder jemand anderes) später schrecklich gebissen, wenn sie versuchen, den Code zu aktualisieren / zu pflegen. Variablenvariablen in Kombination mit dem globalen Gültigkeitsbereich führen zu einer Katastrophe, bei der das einfache Umbenennen einer Variablen dazu führen kann, dass Ihr Code umfällt. Dies bedeutet auch, dass Ihr Code vom JIT-Compiler in HHVM nicht verbessert werden kann, sollte dies jemals ein Problem sein.
Programster
2

Gibt es gute Anwendungsfälle für variable Variablen?

Es hängt von Ihrer Definition von "gut" ab.
Meine persönliche Antwort lautet einfach nein .

Ich habe versucht, eine zu finden, um diese Frage zu beantworten. Ich habe Hilfefragen zu SO gestellt, wo die Leute sie verwenden, und Leitfäden und Blog-Beiträge gelesen.

Ich kann einfach kein Szenario finden, in dem die Verwendung einer variablen Variablen nützlicher oder sinnvoller ist als ein anderer Ansatz .

Alles, was ich mir vorstellen konnte und wo Gründe gegen ihre Verwendung waren.

Ich habe sogar einen Artikel mit dankbaren und positiven Kommentaren gelesen, in dem dargelegt wurde, wie Switch-Anweisungen einfacher werden können.
Anweisungen wechseln, "einfacher"?


Ich würde behaupten, dass selbst für jemanden, der noch nicht mit PHP vertraut ist, ein Array zunächst etwas schwieriger zu handhaben sein könnte, aber die Lernkurve würde weit über die des Lernens variabler Variablen hinausgehen, sobald sie versuchen, sie innerhalb zu verwenden Code.

Es würde bald verwirrend werden, den Fluss variabler Variablen zu verfolgen und zu steuern.
Einmal erlernt, ist ein Array recht einfach anzusehen und zu verwenden.


Wie ich sie sehe, sind sie:

  • Lösen Sie niemals ein Problem, für das eine andere Option nicht mindestens gleichermaßen geeignet ist, normalerweise besser
  • Machen Sie die Verwaltung der Codebasis schwieriger, da Sie jetzt anstelle einer separaten Variablen mit separaten Daten "verknüpfte" Variablen eng miteinander verbunden haben, was ein Chaos ist, das darauf wartet, passiert zu werden
  • Werden sehr selten verwendet, so dass die Lesbarkeit aufgrund von Unbekanntheit möglicherweise beeinträchtigt wird. Besonders in Klassen / Methoden, in denen das Fehlen dieses zusätzlichen $ ($ var -> * $ * rogueVar) ein vorübergehender Schmerz ist
  • Die Informationen für die untergeordnete Variable sind ohne die übergeordnete Variable nicht verfügbar. $var = "james";var name und value sind genau dort.
  • Sogar die Zusammenfassung klingt icky - "eine Variable, deren Name auf einem Wert einer anderen Variablen basiert "

Sogar das PHP-Handbuch enthält Informationen, die, obwohl unbeabsichtigt, zeigen, dass variable Variablen kompliziert und möglicherweise "problematisch" sind:

PHP.net schrieb:

Um variable Variablen mit Arrays zu verwenden, müssen Sie ein Mehrdeutigkeitsproblem lösen. Das heißt, wenn Sie $$ a [1] schreiben, muss der Parser wissen, ob Sie $ a [1] als Variable verwenden wollten oder ob Sie $$ a als Variable und dann den [1] -Index von wollten diese Variable. Die Syntax zum Auflösen dieser Mehrdeutigkeit lautet: $ {$ a [1]} für den ersten Fall und $ {$ a} [1] für den zweiten.

Da ihre Verwendung sehr ungewöhnlich ist, würde ich argumentieren, dass selbst erfahrene Entwickler plötzlich eine Lernkurve haben würden, wenn ein anderer Entwickler dies in ihrem Code verwenden würde.

Variablenvariablen können nicht mit den Superglobal-Arrays von PHP innerhalb von Funktionen oder Klassenmethoden verwendet werden.
Dies ist mehr Lernen und sorgfältige Überlegung, um Probleme zu umgehen, die durch die Verwendung variabler Variablen entstehen.

Ohne Nutzen.


Ich denke, sie waren in früheren Zeiten vielleicht sehr nützlich, als "Dinosaurier" die Rechenzentren durchstreiften. und PHP war nicht stark und viel schneller mit Dingen wie Arrays usw. überarbeitet worden.


Wenn uns variable Variablen eine tiefgreifende Funktionalität oder sogar nur eine sehr nützliche Funktion geben würden, wäre es vielleicht das Lernen wert, sie zu verwenden.

Angesichts dessen, was sie bieten, sehe ich jedoch keinen Sinn darin, sie jemals zu verwenden, selbst wenn ein Array zu viel ist und einige Mikrosekunden mehr verwendet wird, um die Code-Wartbarkeit, Lesbarkeit, die Wahrung der Integrität und keinen Unterschied in der Funktionalität zu gewährleisten Verwenden Sie jedes Mal eine alternative Methode.

James
quelle