Esistono buoni casi d'uso per variabili variabili?

8

Oggi ho incontrato questo piccolo gioiello PHP chiamato variabili variabili .

$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"

Esistono effettivamente casi d'uso reali per questa funzione linguistica?

    
posta miku 28.06.2012 - 03:08
fonte

3 risposte

15

Supponendo un url di http://example.com/hello/world e il seguente .htaccess :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?/$1 [L]

router.php , un router troppo semplicistico, sarebbe:

<?php

$request = explode("/", $_SERVER["REQUEST_URI"]);

$controllerClass = $request[0];
$controllerActionMethod = $request[1];

$controller = new $controllerClass();
$controller->$controllerActionMethod(); // hello::world();

?>

È un uso pratico piuttosto normale delle variabili variabili. Trucchetto accurato, ma dovresti stare estremamente attento quando lo usi, sopra / abusandolo certamente porterà a codice orribilmente non mantenibile.

Dichiarazione di non responsabilità: il codice presentato nella risposta ha il solo scopo di illustrare l'uso della funzione. Non copre la corretta progettazione, sicurezza, manutenibilità o sanità mentale. Non usare.

    
risposta data 28.06.2012 - 03:33
fonte
8

Onestamente? In quasi 10 anni di esperienza in PHP non ho mai riscontrato un problema a cui l'unica soluzione (o addirittura la migliore soluzione da una scelta) era quella di utilizzare una variabile variabile. Il più vicino che ho è essere in grado di accedere a costanti su un'istanza di una classe come $classInstance::CLASS_CONSTANT (che è disponibile da PHP 5.3) e anche in quel caso normalmente non ne ho molto bisogno.

Ho il sospetto che sia una delle molte verruche che esistono in PHP che all'epoca sembrava una buona idea.

Quindi, in risposta alla tua domanda, se ci sono casi d'uso in cui è il migliore o l'unico approccio a un particolare problema, non li ho visti.

    
risposta data 28.06.2012 - 14:17
fonte
2

Are there any good use-cases for variable variables?

Dipende dalla tua definizione di "buono".
La mia risposta personale è semplicemente no .

Ho cercato di inventarne uno solo per rispondere a questa domanda, ho risposto a domande di aiuto su SO in cui le persone li stanno utilizzando e leggo guide e post di blog.

Non riesco a trovare uno scenario in cui si possa sostenere che usare una variabile variabile è più utile o utile di un altro approccio .

Tutto ciò a cui riuscivo a pensare e ho trovato le ragioni per non usarle.

Ho persino letto un articolo, con commenti grati e positivi, che hanno sostenuto come sia possibile rendere più semplici le dichiarazioni degli switch.
Cambiare le dichiarazioni, "più semplice"?

Direi che anche a qualcuno che non ha familiarità con PHP, un array potrebbe essere un po 'più complicato in un primo momento, ma la curva di apprendimento passerebbe oltre quella di imparare variabili variabili una volta che inizieranno a provare a usali nel codice.

Diventerebbe presto fonte di confusione nel tentativo di seguire e controllare il flusso delle variabili variabili.
Mentre una volta appreso, un array è abbastanza semplice da guardare e da usare.

Come li vedo, loro:

  • Non risolvi mai i problemi che un'altra opzione non è almeno altrettanto adatto, solitamente migliore
  • Rendere più difficile la gestione del codebase, perché piuttosto che un separato variabile con dati separati, ora hai le variabili "collegate" strettamente accoppiato insieme, che è un disastro in attesa di accadere
  • Sono usati molto raramente, quindi la leggibilità è probabilmente diminuita a causa di unfamiliarity. Soprattutto in classi / metodi in cui manca quel extra $ ($ var- > * $ * rogueVar) sarà un dolore temporaneo
  • Le informazioni per la variabile figlia non sono disponibili senza genitore. $var = "james"; nome e valore var sono proprio lì.
  • Anche il riassunto suona icky - "una variabile denominata basata su un valore da un'altra variabile "

Anche il manuale PHP contiene informazioni che, sebbene non intenzionali, mostrano variabili variabili complicate e potenzialmente "problematiche":

PHP.net ha scritto:

In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.

Poiché il loro uso è molto raro, direi che anche gli sviluppatori esperti potrebbero improvvisamente avere una curva di apprendimento se un altro sviluppatore lo usasse nel loro codice.

Le variabili variabili non possono essere utilizzate con gli array Superglobal di PHP all'interno di funzioni o metodi di classe.
Questo è più apprendimento e un'attenta considerazione per aggirare i problemi che l'introduzione di variabili variabili comporta.

Per nessun beneficio.

Penso che potrebbero essere stati abbastanza utili nei tempi più antichi, quando i "dinosauri" vagavano per i datacenter. e PHP non era stato refactored molto e molto più veloce con cose come array ecc.

Se le variabili variabili ci hanno dato alcune funzionalità profonde, o anche solo molto utili, allora forse il loro utilizzo sarebbe valso la pena.

Tuttavia, dato quello che offrono, non vedo il punto nel loro utilizzo, anche se un array è eccessivo e utilizzava alcuni microsecondi in più, per motivi di manutenibilità del codice, leggibilità, conservazione del sistema di sanità mentale e nessuna differenza in funzionalità, usa solo un metodo alternativo - ogni volta.

    
risposta data 11.03.2015 - 18:46
fonte

Leggi altre domande sui tag