2017-08-24 1 views
8

Ich wurde erst vor kurzem in das Konzept der dynamischen Variablen in PHP eingeführt. Für mich scheint es, als würde die Verwendung dynamischer Variablen in einem Programm das Lesen/Verfolgen erschweren.Warum dynamische Variablen (variable Variablen) in PHP oder anderen Sprachen verwenden

Kann mir jemand die Vorteile erklären und/oder ein echtes einfaches reales Beispiel teilen, wenn eine dynamische Variable in PHP benötigt wird?

Wenn Ihr fragen, was dynamische Variablen sind und wie sie funktionieren überprüfen this question

+5

Sie werden im Allgemeinen als Variablenvariablen bezeichnet; und nur weil sie existieren, heißt das nicht, dass du sie benutzen musst ... generell würde ich empfehlen, sie nicht zu benutzen, weil es immer eine bessere Alternative gibt –

+0

Es scheint mir, als ob es das Lesen/Folgen erschwert . –

+0

Basierend auf vielen Fragen hier, wo Menschen versuchen, herauszufinden, wie Variablenvariablen zu verwenden, sollten sie normalerweise Array-Schlüssel benennen, anstatt verschiedene Variablen zu erstellen. –

Antwort

6

Ich hatte gestimmt, diese Frage (Abstimmung seit zurückgezogen) zu schließen, auf der Grundlage es subjektiv, sondern auf Reflexion, ich glaube, ich kann geben Sie eine objektive Antwort.

Ein statischer Variablenname ist eine Zeichenfolge, die ein Token darstellt, das von der zugrunde liegenden Engine als Bezeichnung verwendet wird, um den Wert der Variablen zu identifizieren (sehr sehr Laienbeschreibung).

Eine "Zeichenfolge" ist eine Zeichenfolge. Ein String ist ein Ausdruck, der eine Zeichenfolge darstellt. Von daher steht es nahe, dass jeder Ausdruck, der eine Zeichenkette darstellt, gut genug sein sollte, um das Token darzustellen, das auf eine Variable verweist. Und dieser Ausdruck selbst könnte einer Variablen zugewiesen werden, und von dort erhält man dynamische Variablennamen.

Aber das ist nicht das, was Sie gefragt haben. Sie haben gefragt: warum?

Es ist nicht für die Implementoren der Sprache, solche Fragen zu beantworten. Es ist ihre Aufgabe, über ihre Sprache eine einheitliche und vorhersehbare Programmierschnittstelle bereitzustellen. Es ist Uniform in der Lage sein, eine Folge von Zeichen über einen Ausdruck darzustellen, der wiederum durch eine Variable dargestellt werden könnte. Job erledigt.

Subjektiv könnte ich möglicherweise sehen, wo einige Daten aus einer externen Quelle importiert werden, und sogar das Schema der Daten ist dynamisch. Man könnte dies in einer Art generischer Objektweise darstellen, und es führt von dort aus, dass die Namen der Eigenschaften des Objekts auch dynamisch sein können. Ob dies ein guter Ansatz für das vorliegende Problem sein könnte oder nicht, ist völlig subjektiv und liegt im Ermessen des Entwicklers und seiner Kollegen während der Code-Überprüfung.

Ein anderes Beispiel könnte sein, dass Sie einige schäbige Spaghetti-Code geerbt haben, wo "Bedürfnisse muss" und dynamische Namen verwenden - aus welchen Gründen auch immer - könnte ein guter Ansatz sein.

Die PHP-Last endet mit der Bereitstellung des Mechanismus zum Schreiben des Codes; es spricht nicht mit der Qualität des Designs des besagten Codes. Dafür ist Code Review gedacht.

+1

Große Antwort! Danke, dass Sie sich die Zeit für die Erklärung gegeben haben. Du hast ein paar tolle Punkte! – ScottyG

+1

Es ist manchmal besser, eine Frage nicht automatisch zu schließen, wenn diese eine interessante Antwort erzeugt. –

4

Eine variable variable, ist nur eine andere Form von reflection. Sie fragen grundsätzlich "Warum sollten Sie jemals eine Variable ändern wollen, wenn Sie sie vor der Laufzeit nicht kennen".

Obwohl technisch nicht das gleiche, könnten Sie eine variable variable als eine andere Art von hash table (oder array in php) sehen. Die meisten variable variables könnten als hash table umgeschrieben werden, und Sie würden nicht überrascht sein. Aber wenn Sie vor und nach der Laufzeit mit einer Variablen arbeiten müssen, ist eine hash table sogar noch schlimmer.

Ein einfacher Anwendungsfall sind möglicherweise Einstellungen, die von einem Benutzer geändert werden können. Beachten Sie, dass das folgende Beispiel unsicher ist, aber seinen Zweck demonstriert.

<?php 
/* 
Simple way, if you have a limited amount of settings 
*/ 
$settings = array(); 
$settings["allowAccess"] = 1; 
$settings["allowModify"] = 1; 
$settings["allowDelete"] = 0; 

if ($result = $mysqli->query("SELECT `allowAccess`, `allowModify`, `allowDelete` FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    $settings["allowAccess"] = $row["allowAccess"]; 
    $settings["allowModify"] = $row["allowModify"]; 
    $settings["allowDelete"] = $row["allowDelete"]; 
} 

/* 
Now consider you have a thousand settings and you dont want to write out every setting manually. 
*/ 
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    foreach($row as $key => $val) { 
     $settings[$key] = $val; 
    } 
} 

/* 
Both options work, but everytime you want to use a setting you have to use something like below 
*/ 

if ($settings["allowAccess"] && $settings["allowModify"] && $settings["allowDelete"]) { 
    unlink($somefile); 
} 

/* 
Perhaps you would rather write 
*/ 

if ($allowAccess && $allowModify && $allowDelete) { 
    unlink($somefile); 
} 

/* 
Then you can use 
*/ 
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    foreach($row as $key => $val) { 
     //if you use extract, all columns are extracted, unless you drop them first. But perhaps you need those for something else. 
     //now I extract the columns that start with allow and keep the columns like id, created, modified, etc. without the need to specify each column manually, which makes it easier if you ever decide to add another setting column. You don't need to update this part of the code. 
     if (substr($key,0,5)=='allow') { 
      $$key = $val; //$key = 'allowAccess', $$key == $allowAccess = $val; 
     } 
    } 
} 
?> 

Dies ist nur ein Beispiel, fand ich ein weiteres Beispiel in den XHTML sanitizer for MediaWiki von Brion Vibber. Er verwendet viele Arrays in seinem Code und irgendwann musste er sie alle umdrehen. Er verwendet den Code unten:

<?php 
$vars = array('htmlpairs', 'htmlsingle', 'htmlsingleonly', 'htmlnest', 'tabletags', 
       'htmllist', 'listtags', 'htmlsingleallowed', 'htmlelements'); 
foreach ($vars as $var) { 
    $$var = array_flip($$var); 
} 

?> 

Jetzt offensichtlich er den Code geschrieben haben könnte, aber ist das wirklich leichter zu lesen?

<?php         
$htmlpairs = array_flip($htmlpairs); 
$htmlsingle = array_flip($htmlsingle); 
$htmlsingleonly = array_flip($htmlsingleonly); 
$htmlnest = array_flip($htmlnest); 
$tabletags = array_flip($tabletags); 
$htmllist = array_flip($htmllist); 
$listtags = array_flip($listtags); 
$htmlsingleallowed = array_flip($htmlsingleallowed); 
$htmlelements = array_flip($htmlelements); 
?> 

Welche auch einen anderen Anwendungsfall stellt: Was passiert, wenn ich die Arrays zu kippen, um dynamisch entscheiden wollte? In der variable variable Weise kann ich einfach Elemente auf das Array schieben und sie umdrehen, wenn die Zeit kommt, auf die "normale" Weise würde ich eine switch oder if Schleife durch das Array benötigen und dann jede Option manuell hinzufügen.

+0

Interessante Beispiele. Es führt mich zu einer anderen Frage, warum sollte man einen Array-Flip verwenden? – ScottyG

+1

Ich benutzte es in [dieser Antwort] (https://Stackoverflow.com/a/16521079/434949) für den Vergleich der partiellen Ähnlichkeit zweier Strings in PHP. Grundsätzlich verwenden Sie es, wenn Sie häufig überprüfen müssen, ob ein Array einen bestimmten Wert enthält. Indem Sie es einmal spiegeln, können Sie 'array_key_exists' verwenden, anstatt das gesamte Array ständig zu durchlaufen, um zu sehen, ob es den Wert enthält. Aber obwohl dieses Beispiel 'array_flip' verwendet, können Sie' variable Variablen' verwenden, wenn Sie etwas mit vielen Variablen machen wollen oder wenn Sie die Variablen dynamisch zuweisen wollen, mit denen Sie es machen wollen. –

+0

'foreach ($ row als $ key => $ val) {$$ var = array_flip ($$ var); } 'ist einfacher als' extract ($ row) '? – symcbean

Verwandte Themen