¿Constantes de PHP que contienen matrices?

7 minutos de lectura

¿Constantes de PHP que contienen matrices
Nick Heiner

Esto falló:

 define('DEFAULT_ROLES', array('guy', 'development team'));

Aparentemente, las constantes no pueden contener matrices. ¿Cuál es la mejor manera de evitar esto?

define('DEFAULT_ROLES', 'guy|development team');

//...

$default = explode('|', DEFAULT_ROLES);

Esto parece un esfuerzo innecesario.

  • PHP 5.6 admite matrices constantes, vea mi respuesta a continuación.

    – Andrea

    11 de diciembre de 2014 a las 0:14

  • ¿Cuándo necesitaría usar una matriz como constante? ¿Está tratando de hacer una enumeración? Si es así, utilice SplEnum: php.net/manual/en/class.splenum.php

    – ziGi

    11 de diciembre de 2014 a las 0:22


  • @ziGi Encontró este problema hoy, tiene diferentes tipos de imágenes para almacenar que requieren dimensiones específicas, se volvió útil almacenar estas dimensiones como matrices constantes en lugar de una para el ancho y otra para la altura.

    – Matt K.

    11/09/2015 a las 21:09

¿Constantes de PHP que contienen matrices
Andrea

Desde PHP 5.6, puede declarar una matriz constante con const:

<?php
const DEFAULT_ROLES = array('guy', 'development team');

La sintaxis corta también funciona, como era de esperar:

<?php
const DEFAULT_ROLES = ['guy', 'development team'];

Si tiene PHP 7, finalmente puede usar define()tal como lo había intentado por primera vez:

<?php
define('DEFAULT_ROLES', array('guy', 'development team'));

  • Esto debe ser votado porque todas las demás respuestas están desactualizadas o simplemente escritas por usuarios mal informados.

    – Andreas Bergström

    19 de diciembre de 2014 a las 13:09


  • ¿Es esa la única sintaxis? ¿Eres capaz de usar la antigua función de definición? define(‘ARRAY_CONSTANT’, array(‘elemento1’, ‘elemento2’, ‘elemento3’));

    – Jack

    20 de diciembre de 2014 a las 0:31

  • @JackNicholsonn Desafortunadamente no puedes usar define() aquí en PHP 5.6, pero esto ha sido arreglado para PHP 7.0. 🙂

    – Andrea

    21 de diciembre de 2014 a las 3:10


  • @AndreasBergström No, esta pregunta es demasiado nueva. ¡Esta pregunta se hizo en 2009! Esta sintaxis será casi inútil para la mayoría de los usuarios hoy en día. Casi todo el mundo tiene PHP 5.6 en sus servidores. Las otras respuestas están perfectamente bien ya que también ofrecen alternativas. La respuesta aceptada es la única forma viable hasta ahora, si no desea usar clases.

    –Ismael Miguel

    14 de enero de 2015 a las 15:29

  • @IsmaelMiguel no estés tan seguro de que todos tienen 5.6. Cualquier persona en el servidor de Windows acaba de obtener los controladores del servidor 5.6 sql de microsoft hace aproximadamente un mes.

    – M. H.

    9 de julio de 2015 a las 5:28

NOTA: si bien esta es la respuesta aceptada, vale la pena señalar que en PHP 5.6+ puede tener matrices constantes; consulte la respuesta de Andrea Faulds a continuación.

También puede serializar su matriz y luego ponerla en la constante:

# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));

# use it
$my_fruits = unserialize (FRUITS);

  • Solo quiero decir que me encanta esta solución 🙂

    – Asesino de puertas

    25 de mayo de 2011 a las 10:09

  • Agradable. Pero el punto negativo es que no puedes definir una constante de clase de esta manera.

    – Gregorio

    4 de agosto de 2011 a las 7:53

  • mejor adhiérase a las variables estáticas en una clase.

    – Jürgen Paul

    3 de septiembre de 2012 a las 16:05

  • Lástima que no puedas hacer: $fruit = FRUITS[0];

    – Sófivoro

    22 de marzo de 2013 a las 6:49

  • Este código es elegante pero bastante lento. Es mucho mejor usar un método de clase estática pública que devuelve la matriz.

    – sustantivo

    3 de septiembre de 2013 a las 15:13

1646968811 52 ¿Constantes de PHP que contienen matrices
fusión del alma

Puede almacenarlos como variables estáticas de una clase:

class Constants {
    public static $array = array('guy', 'development team');
}
# Warning: array can be changed lateron, so this is not a real constant value:
Constants::$array[] = 'newValue';

Si no le gusta la idea de que otros puedan cambiar la matriz, un getter podría ayudar:

class Constants {
    private static $array = array('guy', 'development team');
    public static function getArray() {
        return self::$array;
    }
}
$constantArray = Constants::getArray();

EDITAR

Desde PHP5.4, incluso es posible acceder a valores de matriz sin necesidad de variables intermedias, es decir, funciona lo siguiente:

$x = Constants::getArray()['index'];

  • +1. Voy por esto desde hace años: const AtomicValue =42; public static $fooArray = ('how','di')

    – Frank Noke

    7 de mayo de 2012 a las 9:16

  • Si bien me parece ridículo que no podamos crear matrices inmutables en php, esto proporciona una solución decente.

    – Akoi Meexx

    28 de agosto de 2012 a las 7:13

  • Si está usando mucho la constante, definitivamente evitaría una llamada de función, son bastante caras. La estática es el camino a seguir.

    – Chris Seufert

    31 de octubre de 2014 a las 0:59

  • Esta solución fue mucho más sorprendente de lo que esperaba: solo necesitaba una parte de los valores de la matriz, por lo tanto, en lugar de simplemente obtener la matriz, usé algunos parámetros en la función. En mi caso, Constants::getRelatedIDs($myID) me da una matriz interna con solo los valores que necesitaba (también realizo alguna validación de ID dentro de esta función). @cseufert obtener toda la matriz y filtrar para cada caso sería mucho más costoso para mí…

    – Brazo

    7 mayo 2015 a las 10:29


  • tener una función (getArray) con un miembro estático privado es la mejor representación para las constantes, ya que pueden ser cambios 👍🏻

    – Kamaldeep singh Bhatia

    23 de enero de 2017 a las 16:08

1646968812 268 ¿Constantes de PHP que contienen matrices
ciclón

Esto es lo que uso. Es similar al ejemplo proporcionado por soulmerge, pero de esta manera puede obtener la matriz completa o solo un valor en la matriz.

class Constants {
    private static $array = array(0 => 'apple', 1 => 'orange');

    public static function getArray($index = false) {
        return $index !== false ? self::$array[$index] : self::$array;
    }
}

Úsalo así:

Constants::getArray(); // Full array
// OR 
Constants::getArray(1); // Value of 1 which is 'orange'

  • Hice lo mismo que tú. Entonces estaba buscando la optimización del rendimiento, ya sea que esto sea bueno o algo mejor.

    – Puntero nulo

    17 de enero de 2017 a las 9:06


  • Sí, estoy de acuerdo con esta solución. Como es simple y fácil de entender…

    – Faris Rayhan

    16 de octubre de 2017 a las 4:06

Puede almacenarlo como una cadena JSON en una constante. Y desde el punto de vista de la aplicación, JSON puede ser útil en otros casos.

define ("FRUITS", json_encode(array ("apple", "cherry", "banana")));    
$fruits = json_decode (FRUITS);    
var_dump($fruits);

  • Esto es exactamente lo que estaba pensando. ¿No es esta una respuesta legítimamente buena?

    – Con Antonakos

    01/07/2014 a las 19:35

  • Esto funciona muy bien con AngularJS porque consume JSON. Siento que esto es mucho mejor que la respuesta de serialización, pero ¿hay alguna razón por la cual la serialización es mejor? ¿Es más rápido quizás?

    – Drellgor

    19/09/2014 a las 18:04

  • Sí, serializar es técnicamente más rápido. Sin embargo, para conjuntos pequeños, que es lo que más se necesita, prefiero este método porque es más seguro. Cuando deserializa, el código podría ejecutarse. Incluso si en este caso se trata de un riesgo muy bajo, creo que deberíamos reservar el uso o deserializar solo para casos extremos.

    – Mario Awad

    8 de diciembre de 2014 a las 13:21

A partir de PHP 5.6, puede definir matrices constantes usando const palabra clave como a continuación

const DEFAULT_ROLES = ['test', 'development', 'team'];

y se puede acceder a diferentes elementos de la siguiente manera:

echo DEFAULT_ROLES[1]; 
....

A partir de PHP 7, las matrices constantes se pueden definir usando define como a continuación:

define('DEFAULT_ROLES', [
    'test',
    'development',
    'team'
]);

y se puede acceder a diferentes elementos de la misma manera que antes.

  • Esto es exactamente lo que estaba pensando. ¿No es esta una respuesta legítimamente buena?

    – Con Antonakos

    01/07/2014 a las 19:35

  • Esto funciona muy bien con AngularJS porque consume JSON. Siento que esto es mucho mejor que la respuesta de serialización, pero ¿hay alguna razón por la cual la serialización es mejor? ¿Es más rápido quizás?

    – Drellgor

    19/09/2014 a las 18:04

  • Sí, serializar es técnicamente más rápido. Sin embargo, para conjuntos pequeños, que es lo que más se necesita, prefiero este método porque es más seguro. Cuando deserializa, el código podría ejecutarse. Incluso si en este caso se trata de un riesgo muy bajo, creo que deberíamos reservar el uso o deserializar solo para casos extremos.

    – Mario Awad

    8 de diciembre de 2014 a las 13:21

1646968812 350 ¿Constantes de PHP que contienen matrices
Rabin Lama Dong

PHP 7+

A partir de PHP 7, solo puede usar el definir() función para definir una matriz constante:

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // outputs "cat"

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad