2010-09-27 40 views
53

Podemos definir una constante como¿Es posible declarar una matriz como constante

define("aconstant','avalue'); 

¿No podemos definir la matriz de esta manera, como a continuación?

define("months",array("January", "February", ---); 
+3

Puede convertir una matriz a una cadena y almacenarla como una constante. Cuando lo necesitas, simplemente lo reconviertes. Mire en el ejemplo de (un) serialización: http://stackoverflow.com/questions/1290318/php-constants-containing-arrays – Armfoot

+1

Sí, desde PHP 5.6 puede hacerlo. Ver http://stackoverflow.com/a/26470982/1163786 –

Respuesta

58

ACTUALIZACIÓN: esto es posible en PHP 7 (reference)

// Works as of PHP 7 
define('ANIMALS', array(
    'dog', 
    'cat', 
    'bird' 
)); 
echo ANIMALS[1]; // outputs "cat" 

respuesta original

De php.net ...

El valor de la constante; solo valores escalares y nulos son permitidos. Los valores escalares son valores enteros, flotantes, de cadena o booleanos. Es posible definir constantes de recursos, sin embargo, no se recomienda y puede causar un comportamiento impredecible.

$months = array("January,"February",...) estará bien.

+2

Por si alguien no nota la otra respuesta, puede crear una matriz "const" en PHP 5.6 o más nuevo. – orrd

+1

No es '$ months = array (" January, "February", ...) '¿Falta una comilla? –

+2

Para que quede claro, la introducción de PHP 7 también incluye matrices asociativas.' Define ('MY_ANIMALS', array ('perro' => 'Ottie', 'gato' => 'Garfield', 'pájaro' => 'Tweetie')); echo MY_ANIMALS ['cat']; // salidas 'Garfield' ' – owenmck

11

No, no puede. Ver PHP: Syntax - Manual

Sólo datos escalares (booleano, entero, flotante y cadena) pueden estar contenidos en las constantes. Es posible definir constantes como un recurso, pero debe evitarse, , ya que puede causar resultados inesperados.

+1

+1 Me pregunto por qué PHP permite definir recursos constantes en primer lugar? – BoltClock

+0

@ BoltClock's a Unicornio: No sé exactamente, nunca me he encontrado con la explicación. Pero dado el historial de desarrollo de php, no sería sorprendente que se deba a algunas 'razones históricas' ... :) –

29

Se puede poner dentro de matrices constantes con un truco:

define('MONTHS', serialize(array('January', 'February' ...))); 

Pero entonces usted tiene que unserialize() ese valor constante cuando sea necesario y creo que esto no es realmente tan útil.

Como alternativa, definir varias constantes:

define('MONTH_1', 'January'); 
define('MONTH_2', 'February'); 
... 

y el uso constant() función para buscar el valor:

echo constant('MONTH_'.$month); 
+3

+1, pero me pregunto, ¿qué pasa con json_encode y json_decode? ¿Cuál es mejor para la memoria y el rendimiento? – jeff

+4

@CengizFrostclaw: 'serialize' would b Mejor en la mayoría de los casos. Incluso si terminó siendo un poco más lento (lo que supongo que es lo contrario de la verdad), es compatible nativamente con conceptos de PHP como referencias y objetos tipeados, que no sobrevivirían a un viaje de ida y vuelta a través de JSON. – cHao

+0

@cHao, sí serialize es más rápido, pero también es peligroso ya que podría ejecutar código. Incluso si aquí esto no se aplica, creo que un desarrollador de seguridad debe acostumbrarse a utilizar los métodos menos peligrosos. En este caso, la diferencia de rendimiento es insignificante y creo que los métodos JSON son mejores aquí. –

6

Si debe tener una constante, cómo sobre el uso de AA cadena delimitada y explotando en una matriz?

define("MONTHS", "January;February;March"); 
$months = explode(";",MONTHS); 
+1

No es una mala opción, me gustaría ver el rendimiento vs serialización. – siliconrockstar

+2

Imagino que tomaría una gran variedad para realmente tener una diferencia significativa. –

75

puede utilizar const para ese propósito a partir de PHP 5.6 (a través de nikic).

const months = ["January", "February"]; 
var_dump("January" === months[0]); 
+0

Esto realmente debería tener más votos ascendentes (que solo los míos ^^). – Levit

+1

@Levit: votaré una vez que pueda usar 5.6 :) – cHao

+0

@cHao: ¡Bien! ^^ Aun así, me encanta que sea posible en 5.6, y esta de facto es la respuesta más limpia/perfecta para 5.6 en adelante. Incluso con 5.3 siendo usado principalmente y 5.6 corriendo en menos del 1% de todos los sitios web php, esto merece más de 1 upvote, solo por señalar la existencia de esa característica (y por lo que muchos años a partir de ahora, cuando esas versiones sean más estándar, esto no se sitúa en 1 voto positivo, mientras que la recomendación de usar una variable tiene más de 200 votos positivos + aceptados). Sry el diablo, ¡de verdad me gusta tu comentario! ^^ – Levit

9

Puede usar el formato JSON para mantener la matriz en la cadena y luego asignar esta cadena a constante.

$months = array("January","February","March"); 
define('MONTHS', json_encode($months)); 

Cuando se desea utilizarlo:

$months = json_decode(MONTHS); 
+0

¡La mejor respuesta para PHP 5.x! –

6

A partir de PHP 5.6, es posible to declare constant arrays. La documentación vinculada utiliza el ejemplo const ARR = ['a', 'b'];. También puede hacer const ARR = array('a', 'b');. Sin embargo, en 5.6 hay una peculiaridad impar: puede declarar arrays constantes usando const, pero no define(). Esto has been corrected en PHP 7.0.

Cuestiones relacionadas