2009-06-16 23 views
5

He estado desarrollando en PHP desde hace un tiempo, y todavía no he tenido una tarea en la que haya tenido que usar variables variables. ¿Alguien puede darme ejemplos donde usarlos es una buena idea? ¿O fueron incluidos en el idioma solo por diversión?Cuándo usar una variable variable en PHP?

+1

Yo sólo uso de vez en cuando PHP ... lo diablos es una "variable variable" en PHP? –

+3

$ foo = 42; $ bar = "foo"; $$ bar ==> 42 – jrockway

Respuesta

5

Una situación en la que he tenido que usarlos es el procesamiento de URI, aunque esta técnica podría estar fechada, y debo admitir que no la he usado en mucho tiempo.

Digamos que queremos extraer el URI del script en el formato domain.tld/controller/action/parameter/s. Podríamos eliminar el nombre del script utilizando la siguiente:

$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']); 

para extraer el controlador, acción y valores de los parámetros de este que vamos a tener que explotar la cadena utilizando el delimitador de ruta '/'. Sin embargo, si hemos principio o al final delimitadores, tendremos valores de la matriz vacía sobre la explosión, por lo que debemos recortar las del principio y el final de la cadena:

$uri_string = trim($uri_string, '/'); 

Ahora puede explotar el camino en una matriz :

$uri_data = explode('/', $uri_string); 

$uri_data[0] contiene ahora nuestra nombre de controlador, $uri_data[1] contiene el nombre de la acción, y los valores de la matriz más allá de que son parámetros que deben ser pasados ​​al método de acción.

$controller_name = $uri_data[0]; 
$action_name = $uri_data[1]; 

Entonces, ahora que tenemos estos nombres, podemos usarlos para una serie de cosas. Si mantiene sus controladores en un directorio muy específico relativo a la raíz del sitio, puede usar esta información en require_once la clase de controlador. En ese punto, se puede crear una instancia de ella y llamarla usando variables variables:

$controller = new $controller_name(); 
$controller->{$action_name}(); // Or pass parameters if they exist 

Hay una gran cantidad de aspectos críticos de seguridad a tener en cuenta en este enfoque, pero esta es una forma en que he visto hacer uso de variables variables

DESCARGO DE RESPONSABILIDAD: No estoy sugiriendo que realmente use este código.

+0

En realidad, puede omitir los $ adicionales si está usando una cadena. Nadie dijo que PHP no era un lenguaje descuidado. :) –

+0

Los uso en ese caso. En primer lugar, recorto y escapo todos los $ _GET, $ _POST y los datos de transmisión de paquetes y luego los uso. mis URL son procesadas por apache de esta manera. site.com/controller/$_GET[1]/$_GET[2]/$_GET[n] así que usarlos como nombres de clase, funciones o parámetros es súper rápido y fácil. Agradecería algunas notas sobre el uso de varianles variables en términos de seguridad. Al igual que la forma en que se procesan las cadenas, si se ponen en el código antes del compilador, etc. $ class -> $ _ GET [1]; $ _GET [1] = 'knownFunction; mysql_query ('DROP *'); '; etcétera etcétera – Supernovah

9

Generalmente los encuentro en lugares donde el código huele mal. Quizás referencias una variable de configuración estática, etc. ... Pero ¿por qué la matriz asociativa habitual no habría sido una mejor solución? Parece un agujero de seguridad esperando a suceder.

Supongo que es posible que pueda usarlos en plantillas de manera efectiva.

7

Nunca los use; una "matriz" es siempre una mejor solución.

+1

+1 Sí - * Cualquier * estructura de datos es la mejor manera – Dario

6

En primer lugar, sería una gran preocupación de seguridad si utilizara la salida del usuario para estos fines. Los internos son el único uso válido aquí.

Dado que, me imagino que es para cosas como recorrer varias variables o enviar variables como parámetros.

foreach($name in array('_GET','_POST','_REQUEST')) { 
    array_map('stripslashes',$$name); 
} 
+0

Buen ejemplo :) –

0

menos que esté trabajando con variables múltiples de profundidad (que no será necesario que si usted no está haciendo nada de fantasía) es probable que no los necesita. Incluso entonces, probablemente pueda encontrar otra forma de escribir lo mismo y obtener el mismo resultado. Puede ser más corto (y en algunos casos incluso más fácil de entender) para usarlos, así que por mi parte estoy contento de que sea parte del lenguaje.

2

No es raro que los idiomas incluyan funciones que no debería tocar con un bargepole (incluso asked a question about it hace un tiempo), y las variables variables son probablemente una de esas construcciones que entran en esta categoría. El hecho de que un idioma contenga una función no significa que deba usarlo.

Puede haber ocasiones cuando resuelven un problema (después de que la recursividad rara vez se usa en la práctica, pero nadie argumentará que no es una construcción esencial) pero en general cualquier característica del idioma que oscurece lo que hace su código, y variable Las variables definitivamente entran en esta categoría, deben tratarse con extrema precaución.

0

No he encontrado muchos usos para las variables variables, pero el uso de variables para los métodos puede ser útil, siempre y cuando lo que estás haciendo sea claro. Por ejemplo, en un simple servicio REST que podría hacer algo como esto:

$method = $request->getMethod(); // 'post','get','put','delete' 
try 
{ 
    $response = $resource->$method($request->getInput()); 
} 
catch (BadMethodException $badMethod) 
{ 
    $response = $responseFactory->getError($badMethod); 
} 

Algunos podrían argumentar que podría hacerlo igual de bien con una declaración switch (que podría) pero de esta manera se presta a la extensibilidad (si decide para agregar otro tipo de método) y mantiene la abstracción de aplicar un método en un recurso.

2

he encontrado una muy buena ..

$php = "templates/php/default.php"; 
$html = "templates/html/default.php"; 
$css = "templates/css/default.php"; 
$js = "templates/js/default.php"; 

ahora le pide al usuario que decir qué archivo que quiere php y/o html ..

$userarray = array("php", "css"); 
foreach($userarray as $file){ 
    var_dump($$file); 
} 

de salida:

templates/php/default.php
templates/css/default.php

Yo mismo he cruzado con este ámbito cuando se trata de variables estáticas self::$file; como esto entonces recordé que podía usar variables variables self::$$file; que serán interpretadas como self::$php;

Cuestiones relacionadas