Forum Programmation.php Tableau en lecture seul

Posté par .
Tags : aucun
0
1
juil.
2009
Bonjour,

je voudrais rendre un tableau (ou plus précisément un tableau associatif) accessible en lecture seulement :

$a = array('foo' => 'bar', 'dev' => 'null');


Comment faire ?

Sachant que :
- la fonction define() ne permet que de définir des constantes alphanumériques ;
- le mot-clé final n'existe pas.

Merci d'avance !
  • # pas compris

    Posté par . Évalué à 1.

    j'ai pas compris la question

    rendre un tableau php en lecture seule :
    suffit de pas ecrire dedans, non ?
    ou peut-etre de le mettre en variable privée afin qu'il ne soit pas accessible en dehors de ta fonction
    (mais sans plus d'info sur ce que tu veux faire, ca va etre dure de t'aider)

    le mot cle "final", il sort d'ou lui ?
    quel est censé etre son role ?
    • [^] # Re: pas compris

      Posté par . Évalué à 2.

      Je pensais au mot-clé final de Java, qui permet d'empêcher la modification d'une variable ultérieurement dans le programme.

      Le but : mon tableau contient toutes les options globales de mon application web. En début de page, les options sont lues en base de données, puis stockées dans ce tableau, pour être facilement accessibles ( $OPTIONS['monOption'] )

      Verrouiller ce tableau en lecture seule n'est pas une nécessité absolue, je trouve simplement cela plus propre. Et comme on peut le faire en Java, j'aimerais le faire également en PHP.

      Est-ce plus clair comme ça ?
      • [^] # Re: pas compris

        Posté par (page perso) . Évalué à 5.

        J'ai cru comprendre de PHP a une notion de classe et d'objet de nos jours. Tu pourrais donc créer un singleton Config dans ce genre là (syntaxe très probablement invalide mais c'est l'idée qui compte) :

        class Config {
        private static $config = array('foo' => 'bar', ...);
        public static get(string $key) {
        return $config[$key];
        }
        }

        Tout code voulant accéder au tableau ne peut utiliser que get() qui ne fait que lire et tout le contenu est fixé à l'initialisation. La syntaxe pour accéder au tableau reste simple (bien qu'on se rende bien compte que c'est pas directement un tableau) et c'est le plus important je pense :

        get('foo')

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

        • [^] # Singleton

          Posté par . Évalué à 3.

          Oui bien sûr j'y ai pensé, mais je trouve ça monstrueusement compliqué par rapport à ce que je veux faire. Et surtout ça perturbe la manière dont mon programme accède aux valeurs du tableau, ce qui me gène (surtout sur le principe).

          J'espère que les futures versions de PHP apporteront la possibilité de rendre finale une variable de type complexe (tableau, objet,...).
          • [^] # Re: Singleton

            Posté par . Évalué à 2.

            en fait sauf si tu developpes en cooperation avec d'autres developpeurs, et que tu as peur que l'un d'eux surcharge ton tableau de configuration

            je ne vois pas vraiment l'interet de mettre le tableau en lecture seule.

            vu que :
            - tu ne vas pas ecrire dedans autrement qu'a partir du code (que tu maitrises vu que tu l'ecris)
            - que selon comment est fait le code, tu reecris ton tableau à chaque rafraichissement de la page (en meme temps que tu refais le connect à ta base de données)

            mais il y a peut-etre une subtilité qui m'echappe :(

            une autre piste pourrait etre de faire une boucle sur les elements de ton tableau et de faire un define(parametre,valeur);
            pour chaque element du tableau

            mais autant que je sache le define peut aussi etre surchargé
            • [^] # Re: Singleton

              Posté par . Évalué à 3.

              en fait sauf si tu développes en coopération avec d'autres développeurs, et que tu as peur que l'un d'eux surcharge ton tableau de configuration

              Deux cas de figures m'intéressent :

              - celui d'une bibliothèque réutilisable, dont l'utilisateur ne touche pas au contenu (ni même ne le regarde, il se contente de la doc) ;
              - celui d'un CMS, framework ou autre système dans lequel des utilisateurs tiers vont écrire des modules additionnels qui seront inclus dans la page.

              C'est inutile d'aller chercher les informations plusieurs fois en base de données parce que c'est certain qu'elles n'auront pas changé entre le début et la fin de l'exécution du script.
              Mais c'est gênant que du code tiers puissent les modifier.

              Exemple, mon application comprend une API SOAP, hébergée sur un autre serveur. L'adresse de ce serveur est renseignée à l'aide d'un formulaire, dans l'espace d'administration, et stockée en base de données. Plusieurs portions de mon code ont besoin de cette information.
              Sur le principe, cela me dérange qu'un bout de code puisse, volontairement ou non, modifier cette adresse (que je stocke donc dans un tableau d'options globales). Et ça me dérange aussi d'aller chercher cette information plusieurs fois en base de données.
          • [^] # Re: Singleton

            Posté par . Évalué à 2.

            J'espère que les futures versions de PHP apporteront la possibilité de rendre finale une variable de type complexe (tableau, objet,...).

            Si php poursuit son chemin pour rejoindre Java, c'est effectivement possible... :-)
            Pari : on verra le "finally { ... } avant le "final" ?
            (Par exemple php 5.3 late static binding : permet de faire des appels de méthodes dynamiques, enfin !)
            • [^] # Re: Singleton

              Posté par . Évalué à 2.

              Les appels de méthodes dynamiques oui, il était temps !!

              Et à choisir, je préfère voir arriver le finally avant le final.
  • # Pas vraiment possible

    Posté par . Évalué à 4.

    En PHP un "array" ne peut pas être constant, mais tu as pleins de "workarounds".
    référencés ici: http://www.php.net/manual/en/function.define.php#89455

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.