65 votes

php const arrays

Est-ce le seul moyen d'avoir des tableaux comme constantes en php ou est-ce un mauvais code ?

class MyClass
{
    private static $myArray = array('test1','test2','test3');

    public static function getMyArray()
    {
       return self::$myArray;
    } 
}

1 votes

Ce n'est pas constant ? c'est seulement statique... imho vous pouvez manipuler le tableau si vous le pointez à travers la méthode... je ne pense pas qu'il soit possible de déclarer un type non-primitif comme constant en php...

0 votes

Je sais que ce n'est pas constant, c'est le but de ma question. Est-ce que la seule façon d'imiter un tableau avec un comportement constant

3 votes

À partir de PHP 5.6.0 (28 août 2014), il est possible de définir une constante de tableau ( see http://stackoverflow.com/a/30031923/1873197

81voto

Niko Points 16715

Votre code est correct - les tableaux ne peuvent pas être déclarés constants en PHP avant la version 5.6, donc l'approche statique est probablement la meilleure solution. Vous devriez envisager de marquer cette variable comme constante via un commentaire :

/** @const */
private static $myArray = array(...);

Avec PHP 5.6.0 ou plus récent, vous pouvez déclarer les tableaux constants :

const myArray = array(...);

6 votes

Attention toutefois, la variable $myArray elle-même peut être modifiée et, en ce sens, elle est moins sûre qu'une constante. Si vous ne pouvez pas utiliser private ou protect, alors je pense qu'il n'y a pas de solution pour la sécurité en php sur les tableaux.

1 votes

Fonctionne lorsque les clés sont constantes, mais la solution ci-dessus ne fonctionne pas lorsque les clés sont issues d'une expression.

19voto

cgaldiolo Points 11

À partir de PHP 5.6.0 (28 août 2014), il est possible de définir une constante de tableau (Voir Nouvelles fonctionnalités de PHP 5.6.0 ).

class MyClass
{
    const MYARRAY = array('test1','test2','test3');

    public static function getMyArray()
    {
        /* use `self` to access class constants from inside the class definition. */
        return self::MYARRAY;
    } 
}

/* use the class name to access class constants from outside the class definition. */
echo MyClass::MYARRAY[0]; // echo 'test1'
echo MyClass::getMyArray()[1]; // echo 'test2'

$my = new MyClass();
echo $my->getMyArray()[2]; // echo 'test3'

Avec PHP 7.0.0 (03 Dec 2015), les constantes de tableau peuvent être définies avec define(). En PHP 5.6, elles ne pouvaient être définies qu'avec const. (Voir Nouvelles fonctionnalités de PHP 7.0.0 )

define('MYARRAY', array('test1','test2','test3'));

9voto

pokeybit Points 71

Je suis tombé sur ce fil de discussion en cherchant moi-même la réponse. Après avoir pensé que je devais faire passer mon tableau dans chaque fonction où il était nécessaire. Mon expérience avec les tableaux et mysql m'a fait me demander si serialize fonctionnerait. Bien sûr, c'est le cas.

define("MYARRAY",     serialize($myarray));

function something() {
    $myarray= unserialize(MYARRAY);
}

0 votes

Cela le définit dans la portée globale, cependant, pas dans le contexte de la classe. C'est utile dans certains cas, cependant, j'ai déjà utilisé ce comportement auparavant.

2voto

Kira M. Backes Points 500

Je suggère d'utiliser ce qui suit :

class MyClass
{
    public static function getMyArray()
    {
       return array('test1','test2','test3');
    } 
}

De cette façon, vous disposez d'un tableau constant et vous avez la garantie que personne ne peut le modifier, pas même une méthode de la classe elle-même.

Possibilité de micro-optimisation (je ne sais pas si les compilateurs PHP optimisent beaucoup de nos jours) :

class MyClass
{
    public static function getMyArray()
    {
       static $myArray = array('test1','test2','test3');
       return $myArray;
    } 
}

1voto

Joe Points 477

Le marquage statique est une bonne alternative. Voici un exemple d'encapsulation d'un tableau statique pour obtenir un peu de constant comportement.

class ArrayConstantExample {

    private static $consts = array(
        'CONST_MY_ARRAY' => array(
            1,2,3,4
        )
    );

    public static function constant($name) {
        return self::$consts[$name];
    }

}

var_dump( ArrayConstantExample::constant('CONST_MY_ARRAY') );

Imprimés :

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }

0 votes

Juste un petit FYI : Cela ne rend pas la variable constante. Cela lui donne simplement l'apparence d'une constante dans le code. Bien que le développeur puisse se sentir mieux, il n'est pas plus à l'abri des abus que les autres réponses. Nous voulons juste éviter que les lecteurs pensent que la variable est constante de quelque manière que ce soit.

0 votes

Mon code s'ajoute à la réponse acceptée pour encapsuler le tableau. Vous avez en quelque sorte raison car le tableau peut toujours être modifié dans la même classe. Ce que je veux dire, c'est que vous pouvez accéder au tableau en dehors de la classe, mais pas le modifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X