Le variabili variabili sembrano piuttosto interessanti, ma non riesco a pensare a uno scenario in cui verrebbero effettivamente utilizzati in un ambiente di produzione. Quale sarebbe uno scenario del genere? Come sono stati usati?Cos'è un uso effettivo di variabili variabili?
risposta
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.
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; ?>!
Questa stessa cosa può essere eseguita con ['extract'] (http://ca.php.net/manual/en/function.extract.php) –
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
@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
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).
Quelle non sono variabili variabili. I metodi non sono variabili. – Artefacto
Anche se possono essere (tipo) se questo va avanti: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto
È una funzione variabile. Hai ragione. Funziona ancora sullo stesso principio (dove la variabile è dereferenziata per determinare il percorso di esecuzione) ... – ircmaxell
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 :)
Si potrebbe semplicemente fare '$ obj -> {'media $ titolo'}'. – Artefacto
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.
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
Perché non solo 'array_map'? – user151841
- 1. Uso delle variabili nei post di Blogger
- 2. Uso di variabili locali finali in java
- 3. Uso di variabili in JSTL param
- 4. Uso Stata etichette di variabili in R
- 5. Uso di variabili in una query MySQL
- 6. Posso avvisarmi quando uso variabili non impostate?
- 7. Uso delle variabili SASS all'interno dell'n-child?
- 8. Uso effettivo del bloccoInterruptibly per un ReentrantLock
- 9. PowerShell Variabili globali variabili locali
- 10. Java supporta variabili variabili?
- 11. Uso di variabili di sola lettura negli script di shell
- 12. variabili variabili in PHP
- 13. Bash - variabili variabili
- 14. Variabili variabili PHP con chiave di array
- 15. Uso delle variabili nelle regole di posizione Nginx
- 16. Variabili di istanza Java vs variabili locali
- 17. Uso delle variabili nello script di build Gradle
- 18. variabili di istanza del modello django per uso transitorio
- 19. Rails - Variabili locali contro variabili di istanza
- 20. variabili “var”, "Questo" variabili e variabili "globali" - all'interno di un costruttore JavaScript
- 21. Variabili di istanze costanti?
- 22. Come posso usare ddply con variabili variabili?
- 23. Quale è più veloce? Costanti, variabili o array di variabili
- 24. Uso delle variabili per le proprietà CSS in Sass
- 25. jquery: uso (“padre> figlio”) con le variabili
- 26. Angolare 2 variabili componente variabili su un altro componente
- 27. accesso variabili variabili nidificate in ansible
- 28. variabili di istanza della classe python e variabili di classe
- 29. Rimodellare più variabili categoriali di variabili di risposta binarie
- 30. Variabili Android (get) variabili ambientali in Java
// 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
Penso che sia il significato delle citazioni. – user151841
in che modo questa risposta è stata svitata tante volte e accettata? – jasonszhao