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.
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 –
Es scheint mir, als ob es das Lesen/Folgen erschwert . –
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. –