2010-08-19 5 views

Antwort

4

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.

+0

// 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

+1

Ich denke, das ist die Bedeutung der Zitate. – user151841

+1

Wie wurde diese Antwort so oft aufgegriffen und akzeptiert? – jasonszhao

1

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; ?>! 
+0

Das gleiche kann mit ['extract'] (http://ca.php.net/manual/en/function.extract.php) –

+2

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

+0

@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

1

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).

+1

Das sind keine variablen Variablen. Methoden sind keine Variablen. – Artefacto

+0

Obwohl sie (irgendwie) sein können, wenn das weitergeht: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto

+0

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

1

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 :)

+0

Sie könnten einfach '$ obj -> {'media $ title'}'. – Artefacto

2

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.

0

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

+0

Warum nicht nur 'array_map'? – user151841

Verwandte Themen