Variable Variablen scheinen ziemlich cool zu sein, aber ich kann mir kein Szenario vorstellen, in dem man sie tatsächlich in einer Produktionsumgebung verwenden würde. Was wäre ein solches Szenario? Wie wurden sie benutzt?Was ist eine tatsächliche Verwendung von Variablenvariablen?
Antwort
Der Zweck, ich denke, ist es, Anfänger Programmierern zu erlauben, Daten dynamisch zu ändern, ohne "komplizierte Sachen" wie zusammengesetzte Typen (Arrays und Objekte) zu verwenden.
Ich benutze sie nie.
Denken Sie daran, zur Verwendung in einem Template-System, wo Sie PHP-Dateien verwenden und müssen in Variablen setzen:
function fetch_template($file, $vars){
$ret = 'File not loaded.';
if(file_exists(TEMPLATE_PATH.$file)){
//could do this with extract() but I am showing you
foreach($vars as $varName => $value){
${$varName} = $value;
}
ob_start();
include(TEMPLATE_PATH.$file);
$ret = ob_get_contents();
ob_end_clean();
}
return $ret;
}
Nimmt man nun an Sie diese Variablennamen in der Vorlage verwendet wird, können Sie es und Pass nennen Variablen hinein für den Gebrauch.
echo fetch_template('hi_there.tpl', array('name'=>'JJ'));
Dann in Ihrer Vorlage:
Hello <?php echo $name; ?>!
Das gleiche kann mit ['extract'] (http://ca.php.net/manual/en/function.extract.php) –
gemacht werden Und jetzt haben Sie einen Fehler' $ vars' hat einen Schlüssel '" Datei "'. Aus diesem Grund sind Variablen (und auch "extrahieren") gefährlich. Wäre es so viel schwieriger, etwas wie $ m ['var'] 'in der Vorlage zu verwenden? – Artefacto
@Daniel: Das Codebeispiel besagt explizit, dass dies mit extract() geschehen kann. Dies war ein Beispiel. @Artefecto: Dies wurde nicht erstellt, um Sicherheit zu demonstrieren, sondern stattdessen die Verwendung von Variablenvariablen. Ich habe nie befürwortet, Variablen blind in das $ _GET-Array einzugeben. – Jage
Ich persönlich benutze sie ziemlich oft. Alle Anrufe der folgenden Typen verwenden variabler Variablen:
$foo->$bar = 'test';
$foo->$bar();
$bar();
Also jedes Mal, wenn eine dynamische Methode/Funktionsaufruf tun, sind Sie mit variabler Variablen ...
Eine häufige Anwendung hierfür ist, Zugriff auf geschützte Eigenschaften über die magische Methode __get
. Ich habe folgende ziemlich oft gesehen:
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
die definitionsgemäß variable Variablen verwendet bieten Lesezugriff auf den geschützten Mitglieder ...
Ich habe nie direkt die $$var
Syntax verwendet (und glaube nicht, dass ich jemals werde). Ich habe gesehen, dass es verwendet wurde, um auf globale Variablen mit dem Namen global $$name; echo $$name;
zuzugreifen, aber das gleiche kann mit der $_GLOBALS[$name]
Syntax getan werden, also ist das kein guter Anwendungsfall (nicht zu erwähnen, dass die Verwendung globaler Variablen normalerweise als schlechte Praxis angesehen wird).
Das sind keine variablen Variablen. Methoden sind keine Variablen. – Artefacto
Obwohl sie (irgendwie) sein können, wenn das weitergeht: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto
Es ist eine Variable-Funktion. Du hast recht. Es operiert immer noch auf dem gleichen Prinzipal (wo die Variable dereferenziert wird, um den Ausführungspfad zu bestimmen) ... – ircmaxell
Ich fand es in einem einzigen Szenario nützlich. Ich wurde im JSON-Format API Ergebnisse YouTube mit, wie diese
$obj->media$title => Video title
So habe ich es wie
$mt = 'media$title';
$obj->$mt ;
So ist es hier für mich gearbeitet :)
Sie könnten einfach '$ obj -> {'media $ title'}'. – Artefacto
Eine Variable Variable ist im Wesentlichen ein Array (Karte/Wörterbuch). Folgende Aussagen sind äquivalent Ideen:
<?php
$foo = array('a' => 1);
$bar = 'a';
echo $foo[$bar]."\n";
$foo_a = 1;
$bar = 'a';
$vv = "foo_$bar";
echo $$vv."\n";
?>
Wenn Sie also Ihre „variable Variablen“ in eine übergeordnete Array wickeln, man kann mit ihnen tun, weg.
Ich habe gesehen, wie Menschen verwenden variable Eigenschaften innerhalb von Klassen:
<?php
class Foo
{
private $a = 1;
public function __get($key)
{
if (isset($this->$key)) return $this->$key;
}
}
$foo = new Foo();
echo $foo->a;
?>
Aber auch hier könnte man einen Array verwenden:
<?php
class Foo
{
private $props = array('a' => 1);
public function __get($key)
{
if (array_key_exists($key, $this->props))
return $this->props[$key];
}
}
$foo = new Foo();
echo $foo->a;
?>
Und außerhalb Klassen:
<?php
class Foo
{
public $a = 1;
}
$foo = new Foo();
$prop = 'a';
echo $foo->{$prop};
?>
So Sie müssen niemals Variablenvariablen oder Variableneigenschaften verwenden, wenn Sie Ihren eigenen kontrollierten Code schreiben. Meine persönliche Vorliebe besteht darin, niemals Variablen zu verwenden. Ich verwende gelegentlich Variableneigenschaften, verwende aber lieber Arrays, wenn ich auf diese Weise auf Daten zugreife.
Ich benutze es vor allem copy-paste in desinfizierenden get/post-Daten in dem Anfang einer PHP-Datei zu reduzieren: Es macht hygienisiert Variablen mit den richtigen Namen:
$fields=array('age','name','gender','email','username');
foreach($fields as $field) {
if (empty($_REQUEST[$field] === false)
${$field} = sanitize($_REQUEST[$field]);
else
${$field} = '';
}
statt all diesen Linien:
if (empty($_GET['age']) === false)
$age= sanitize($_GET['age']);
else
$age= '';
if (empty($_GET['name']) === false)
$name= sanitize($_GET['name']);
else
$name = '';
if (empty($_GET['gender']) === false)
$gender= sanitize($_GET['gender']);
else
$gender= '';
if (empty($_GET['email']) === false)
$email= sanitize($_GET['email']);
else
$email= '';
if (empty($_GET['username']) === false)
$username= sanitize($_GET['username']);
else
$username= '';
ich hoffe, es hilft
Warum nicht nur 'array_map'? – user151841
- 1. Was ist die tatsächliche Verwendung von .so-Datei in Android?
- 2. Was ist die tatsächliche Verwendung der Schnittstelle in Java?
- 3. Unterstützt Java Variablenvariablen?
- 4. Tatsächliche Verwendung von Jade Vorlage und angularjs
- 5. Was ist der tatsächliche Vorteil von ADO.NET Entity Framework?
- 6. Was ist die tatsächliche Implementierung von Lua __pairs?
- 7. Was ist die Verwendung von "??"
- 8. Was ist die korrekte Verwendung von ConcurrentBag?
- 9. Was ist eine Alternative für die Verwendung von com.nineoldandroids Bibliothek
- 10. Was ist die Verwendung von Parbase-Komponente:
- 11. Was ist die Verwendung von SingletonList?
- 12. Was ist die Verwendung von AtomicReferenceArray?
- 13. Was ist die Verwendung von javax.mail.Session?
- 14. Was ist die Verwendung von mehreren Hauptmethoden?
- 15. Was ist die ordnungsgemäße Verwendung von EnsureChildControls()?
- 16. Was ist die Verwendung von .bind()
- 17. Tatsächliche Verwendung von Entwurfsmustern in Open-Source-Software?
- 18. Was ist der tatsächliche Unterschied zwischen RTMFP und BitTorrent?
- 19. Was ist die Verwendung von Assert.Equals?
- 20. Was ist die Verwendung von Keyword final?
- 21. Was ist die Verwendung von "const"?
- 22. was ist die Verwendung von stringsByAppendingPaths
- 23. Was ist die Verwendung von string.Clone()?
- 24. Was ist die Verwendung von CADisplayLink iOS
- 25. Was ist die Verwendung von Javascript scrollTimeout?
- 26. was ist die Verwendung von transparent?
- 27. Was ist die Verwendung von Schatten
- 28. Was ist die Verwendung von while (1)?
- 29. Was ist die Verwendung von $ # in Bash
- 30. Was ist Verwendung von haben? in java
// Anfänger Programmierer erlauben Daten dynamisch zu ändern, ohne „komplizierte Sachen“ wie Verbundtypen (Arrays und Objekte) // Es ist nicht kompliziert, sobald es gelernt wurde. – dreftymac
Ich denke, das ist die Bedeutung der Zitate. – user151841
Wie wurde diese Antwort so oft aufgegriffen und akzeptiert? – jasonszhao