2011-01-09 11 views
10

Me preguntaba cuál es la mejor y más limpia forma de definir una variable de matriz constante similar a la forma en que define la función funciona. He visto una gran cantidad de gente que pide esta pregunta en Google y hasta ahora la solución más fácil que he llegado con es utilizar el PHP serializar función dentro de la definir declaración, como esto¿Cuál es la forma más "elegante" de definir un conjunto constante global en PHP

define ("MY_ARRAY", serialize (array ("key1" => $value1,"key2" => $value2, ..))); 

entonces utilizar la constante definida que puede hacer algo como esto:

$MY_ARRAY = unserialize (MY_ARRAY) 
print_r ($MY_ARRAY); 

No estoy seguro si la función serializar le hará perder tiempo si usted tiene una gran cantidad de define en tu código ¿Qué piensas?

+1

Para qué necesita la var global. Tal vez hay un mejor enfoque. – PeeHaa

+2

$ GLOBALS ['MY_ARRAY'] = array(); – dqhendricks

+0

¡PeeHaa, necesitaría que fuera global si quisiera acceder a la matriz constante desde dentro de cualquier clase o función en el mismo espacio de nombres! – techexpert

Respuesta

6
$GLOBALS['MY_ARRAY'] = array(); 
+0

¿Alguien puede anular MY_ARRAY con $ _POST ["MY_ARRAY"} o $ _GET ["MY_ARRAY"] e inyectar su propio código de esta manera? – techexpert

+0

no, esa es la razón por la que se inventaron las matrices súper globales. En los viejos tiempos, la gente solía establecerlo en la configuración de PHP para que las variables de los posts se convirtieran en variables globales, hasta que se dieron cuenta de que se trataba de un sueño para los hackers. para estar seguro, pruébelo en su servidor de prueba y vea qué pasa. – dqhendricks

+0

$ GLOBALS no está relacionado de ninguna manera con las variables $ _POST o $ _GET. – dqhendricks

6

La serialización y especialmente la deserialización es bastante incómoda. (Por otro lado, no está del todo claro por qué un lenguaje de scripts no puede tener matrices como constantes ...)

Pero realmente depende del patrón de uso. Normalmente quiere definiciones globales para almacenar las configuraciones. Y las variables globales y constantes son un uso apropiado para eso (a pesar del meme "¡globals are evil! 1!"). Pero es recomendable tirar todo en una especie de objeto de registro o matriz, al menos:

class config { 
    var $MY_ARRAY = array("key1"=>...); 
    var $data_dir = "/tmp/"; 
} 

Esto da la sintaxis de acceso más simple con config::$MY_ARRAY. Eso no es una constante, pero puedes fingirlo fácilmente. Solo use ArrayObject o ArrayAccess e impleméntelo de forma que los atributos sean de solo lectura. (. Hacer offsetSet Lanza un error)

Si desea una solución constante de matriz global, entonces otra alternativa (he robado esta idea de la define manual page) es utilizar una función en lugar de una constante:

function MY_ARRAY() { 
    return array("key1" => $value1,); 
} 

El acceso nuevamente no es bastante constante, pero MY_ARRAY() es lo suficientemente corto. Aunque el agradable acceso a la matriz con MY_ARRAY()["key1"] no es posible antes de PHP 5.3; pero de nuevo esto podría ser falso con MY_ARRAY("key1") por ejemplo.

+0

Mario, ¿qué puede, potencialmente, ir mal con la serialización? Además, ni la función ni la clase entrarían en el ámbito global. – techexpert

+0

@techexpert, no hay nada de malo con la serialización realmente. Pero 'unserialize (MY_ARRAY)' lee bastante largo, y siempre necesita una variable temporal para desempaquetar. Este tipo de rechaza el propósito de las constantes de fácil acceso. También podría definir una función 'my_const_array (" NAME ")' para obtenerla de un registro. – mario

+0

Realmente quería encontrar una alternativa a la declaración "definir" para matrices, por lo que puede pasar la variable a cualquier función de una manera limpia, como: call_function (MY_ARRAY) – techexpert

Cuestiones relacionadas