2010-08-19 21 views

risposta

4

Il suo scopo, immagino, è di consentire ai principianti programmatori di modificare dinamicamente i dati senza utilizzare "cose ​​complicate" come i tipi compositi (matrici e oggetti).

Non li uso mai.

+0

// consentire ai programmatori alle prime armi per cambiare dinamicamente i dati senza l'utilizzo di "roba complicata", come tipi compositi (array e gli oggetti) // Non è complicato una volta che è stato appreso. – dreftymac

+1

Penso che sia il significato delle citazioni. – user151841

+1

in che modo questa risposta è stata svitata tante volte e accettata? – jasonszhao

1

Pensate per l'utilizzo in un sistema modello in cui si utilizzano i file PHP e necessario impostare nelle variabili:

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; 
} 

Ora supponendo che hai utilizzato questi i nomi delle variabili nel modello, si potrebbe chiamare e passa variabili in esso per l'uso.

echo fetch_template('hi_there.tpl', array('name'=>'JJ')); 

Poi nel modello:

Hello <?php echo $name; ?>! 
+0

Questa stessa cosa può essere eseguita con ['extract'] (http://ca.php.net/manual/en/function.extract.php) –

+2

E ora si ha un bug' $ vars' ha una chiave '" file "'. Questo è il motivo per cui le variabili variabili (e 'extract', per quella materia) sono pericolose. Sarebbe molto più difficile usare qualcosa come '$ m ['var']' nel modello? – Artefacto

+0

@Daniel: l'esempio di codice dice esplicitamente che è possibile farlo con extract(). Questo è stato un esempio @Artefecto: questo non è stato prodotto per dimostrare la sicurezza, ma piuttosto l'uso di variabili variabili. Non ho mai sostenuto il passaggio di variabili ciecamente come qualsiasi cosa nell'array $ _GET. – Jage

1

Personalmente, li uso abbastanza spesso. Tutte le chiamate dei seguenti tipi utilizzano variabili-variabili:

$foo->$bar = 'test'; 
$foo->$bar(); 
$bar(); 

Così ogni volta che si esegue una chiamata di metodo/funzione dinamica, che si sta utilizzando variabili-variabili ...

Un uso comune per questo è accesso alle proprietà protette tramite il metodo magico __get. Ho visto quanto segue abbastanza spesso:

public function __get($name) { 
    return isset($this->$name) ? $this->$name : null; 
} 

che per definizione è l'utilizzo di variabili variabili per fornire l'accesso in lettura ai membri protetti ...

non ho mai usato direttamente la sintassi $$var (e non penso che lo farò mai). L'ho visto usato per accedere alle variabili globali con il nome global $$name; echo $$name;, ma la stessa cosa può essere fatta con la sintassi $_GLOBALS[$name], quindi non è un buon caso d'uso (per non parlare del fatto che l'uso di variabili globali è generalmente considerato una cattiva pratica).

+1

Quelle non sono variabili variabili. I metodi non sono variabili. – Artefacto

+0

Anche se possono essere (tipo) se questo va avanti: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto

+0

È una funzione variabile. Hai ragione. Funziona ancora sullo stesso principio (dove la variabile è dereferenziata per determinare il percorso di esecuzione) ... – ircmaxell

1

L'ho trovato utile in un unico scenario. Stavo facendo YouTube risultati API in formato JSON, come questo

$obj->media$title => Video title 

Così l'ho usato come

$mt = 'media$title'; 
$obj->$mt ; 

Così ha funzionato per me qui :)

+0

Si potrebbe semplicemente fare '$ obj -> {'media $ titolo'}'. – Artefacto

2

Una variabile variabile è essenzialmente un array (mappa/dizionario). Di seguito sono idee equivalenti:

<?php 
$foo = array('a' => 1); 
$bar = 'a'; 
echo $foo[$bar]."\n"; 

$foo_a = 1; 
$bar = 'a'; 
$vv = "foo_$bar"; 
echo $$vv."\n"; 
?> 

Pertanto, se si avvolgere la "variabili" variabili in un array di genitore, si può fare a meno di loro.

persone che ho visto usano proprietà delle variabili all'interno di classi:

<?php 
class Foo 
{ 
    private $a = 1; 

    public function __get($key) 
    { 
    if (isset($this->$key)) return $this->$key; 
    } 
} 

$foo = new Foo(); 
echo $foo->a; 
?> 

Ma ancora una volta, è possibile utilizzare un array:

<?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; 
?> 

e classi esterne:

<?php 
class Foo 
{ 
    public $a = 1; 
} 

$foo = new Foo(); 
$prop = 'a'; 
echo $foo->{$prop}; 
?> 

Così non si deve mai "usare" variabili variabili o proprietà variabili quando si scrive il proprio codice controllato. La mia preferenza personale è di non usare mai variabili variabili. Occasionalmente utilizzo le proprietà variabili, ma preferisco utilizzare gli array quando accedo ai dati in questo modo.

0

Io principalmente lo uso per ridurre il copia-incolla in igienizzante dati get/post in l'inizio di un file php: Rende variabili sanificati con i nomi propri:

$fields=array('age','name','gender','email','username'); 

foreach($fields as $field) { 
    if (empty($_REQUEST[$field] === false) 
     ${$field} = sanitize($_REQUEST[$field]); 
    else 
     ${$field} = ''; 
} 

invece di tutte queste linee:

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= ''; 

spero che aiuta

+0

Perché non solo 'array_map'? – user151841

Problemi correlati