¿Hay algún buen caso de uso para variables variables?

8

Hoy me encontré con esta pequeña joya PHP llamada variables variables .

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

¿Existe realmente algún caso de uso real para esta función de lenguaje?

miku
fuente
1
Como la mayoría de los "trucos oscuros", sus casos de uso reales son muy limitados, por lo general hay formas mucho más limpias de implementar esos casos de uso e incluso si el caso de uso coincide perfectamente con el truco, será difícil de mantener.
Joachim Sauer
1
@JoachimSauer No es realmente oscuro, las variables variables están en el corazón de los bucles foreach.
Yannis

Respuestas:

15

Suponiendo una url de http://example.com/hello/world, y lo siguiente .htaccess:

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

router.php, un enrutador demasiado simplista, sería:

<?php

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

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

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

?>

Es un uso práctico bastante estándar de variables variables. Buen truco, pero debes ser extremadamente cuidadoso al usarlo, abusar de él sin duda conducirá a un código horriblemente imposible de mantener.

Descargo de responsabilidad: el código presentado en la respuesta solo pretende ilustrar el uso de la función. No cubre el diseño adecuado, la seguridad, la mantenibilidad o la cordura. No utilice.

Yannis
fuente
99
Descargo de responsabilidad: el código presentado en la respuesta solo pretende ilustrar el uso de la función, nada más. En cuanto a la calidad, es absolutamente una mierda, no lo use.
Yannis
(PHP novato aquí) No veo exactamente dónde usó las variables variables, solo veo dólares individuales. Sospecho que tiene que ver con el .htaccess, pero tampoco los entiendo bien.
Manishearth
3
@YannisRizos: su ejemplo utiliza un nombre de método variable, no una variable variable. Es completamente diferente. Está llamando efectivamente a un método a través de la reflexión en lugar de a una variable por reflexión.
Jonno
1
@ Jonon Heh, pensé exactamente lo mismo cuando alguien me explicó por primera vez las variables variables;) La primera "variable", sin embargo, se refiere a la naturaleza dinámica de la (segunda) variable (la estructura), y su método se referencia dinámicamente, Y eso es todo. $controller es una variable (la estructura), pero lo que contiene se establece dinámicamente, por lo tanto, una variable variable. Un poco de nombre tonto, ¿no?
Yannis
1
@ YannisRizos: respetuosamente no estoy de acuerdo. Una variable variable, es exactamente esa variable, que se crea en el ámbito del código creado correctamente. Lo que está haciendo aquí es llamar a un método, cuyo nombre se define mediante una variable. Según esa lógica, cualquier uso de una 'variable' para hacer algo que ... 'varía' es una variable variable.
Jonno
8

¿Honestamente? En casi 10 años de experiencia en PHP, nunca me he encontrado con un problema para el cual la única solución (o la mejor opción) era usar una variable variable. Lo más cercano que tengo es poder acceder a las constantes en una instancia de una clase como $classInstance::CLASS_CONSTANT(que ha estado disponible desde PHP 5.3) e incluso entonces normalmente no tengo mucho uso para ello.

Sospecho que es una de las muchas verrugas que existen en PHP que parecía una buena idea en ese momento.

Entonces, en respuesta a su pregunta, si hay casos de uso donde es el mejor o el único enfoque para un problema en particular, no los he visto.

GordonM
fuente
Lo mismo aquí: en siete años trabajé por intervalos con PHP, nunca encontré vv (de todos modos en el código de producción).
miku
Las variables variables pueden parecer un buen truco, pero luego te morderá (o a otra persona) horriblemente más adelante cuando intenten actualizar / mantener el código. Las variables variables combinadas con el alcance global dan como resultado un desastre en el que simplemente cambiar el nombre de una variable podría hacer que su código se caiga. También significa que su compilador JIT en HHVM no puede mejorar su código si eso fuera un problema.
Programador
2

¿Hay algún buen caso de uso para variables variables?

Depende de su definición de "bueno".
Mi respuesta personal es simplemente no .

Traté de encontrar uno solo para responder a esta pregunta, hice preguntas de ayuda sobre SO donde la gente los usa, y leí unas guías y publicaciones en el blog.

Simplemente no puedo encontrar un escenario en el que pueda argumentarse que usar una variable variable es más útil o valioso que otro enfoque .

Todo lo que se me ocurrió y encontré razones en contra de su uso.

Incluso leí un artículo, con comentarios agradecidos y positivos, que argumentaba cómo puede facilitar las declaraciones de cambio.
Cambiar declaraciones, "más simple"?


Yo diría que incluso para alguien muy nuevo en PHP, una matriz podría ser un poco más difícil de entender al principio, pero la curva de aprendizaje pasaría mucho más allá de las variables de aprendizaje una vez que comiencen a usarlas código.

Pronto sería confuso tratar de seguir y controlar el flujo de variables variables.
Mientras que una vez aprendido, una matriz es bastante simple de ver y usar.


Tal como los veo, ellos:

  • Nunca resuelva ningún problema en el que otra opción no sea al menos igual de adecuada, generalmente mejor
  • Haga que la gestión de la base de código sea más difícil, porque en lugar de una variable separada con datos separados, ahora tiene variables "vinculadas" estrechamente unidas, lo cual es un desastre esperando a suceder
  • Se usan muy raramente, por lo que la legibilidad se reduce debido a la falta de familiaridad. Especialmente en clases / métodos donde perder ese $ extra ($ var -> * $ * rogueVar) será un dolor temporal
  • La información para la variable secundaria no está disponible sin la matriz. $var = "james";El nombre y el valor de var están ahí.
  • Incluso el resumen suena repulsivo : "una variable nombrada en base a un valor de otra variable"

Incluso el manual de PHP tiene información que, aunque no es intencional, muestra que las variables variables son complicadas y potencialmente "problemáticas":

PHP.net escribió:

Para utilizar variables variables con matrices, debe resolver un problema de ambigüedad. Es decir, si escribe $$ a [1], entonces el analizador debe saber si quería usar $ a [1] como variable, o si quería $$ a como variable y luego el índice [1] de esa variable La sintaxis para resolver esta ambigüedad es: $ {$ a [1]} para el primer caso y $ {$ a} [1] para el segundo.

Como su uso es muy poco común, diría que incluso los desarrolladores experimentados de repente tendrían alguna curva de aprendizaje si otro desarrollador usara esto en su código.

Las variables variables no se pueden usar con las matrices Superglobal de PHP dentro de funciones o métodos de clase.
Esto es más aprendizaje y una cuidadosa consideración para solucionar problemas que presentan variables variables.

Sin beneficio


Creo que pueden haber sido bastante útiles en tiempos antiguos, cuando los "dinosaurios" deambulaban por los centros de datos. y PHP no había sido refactorizado en gran medida y mucho más rápido con cosas como matrices, etc.


Si las variables variables nos dieron una funcionalidad profunda, o incluso muy útil, quizás valga la pena aprender a usarlas.

Sin embargo, dado lo que ofrecen, simplemente no veo el punto de usarlos, incluso si una matriz es exagerada y usó algunos microsegundos más, en aras del mantenimiento del código, la legibilidad, la preservación de la cordura y no hay diferencia en la funcionalidad, solo use un método alternativo cada vez.

James
fuente