2010-05-13 8 views
2

J'ai une classe avec une méthode statique. Il y a un tableau pour vérifier qu'un argument de chaîne passé est un membre d'un ensemble. Mais, avec la méthode statique, je ne peux pas référencer la propriété de classe dans une classe non instanciée, ni avoir un tableau comme constante de classe. Je suppose que je pourrais coder en dur le tableau dans la méthode statique, mais si j'ai besoin de le changer, je devrais me rappeler de le changer à deux endroits. Je voudrais éviter cela.comment puis-je contourner aucun tableau comme constantes de classe en php?

+0

valeurs statiques ne sont vraiment pas agréable. Tu ne devrais pas en avoir besoin. – erisco

Répondre

6

Vous pouvez créer une fonction statique privée qui va créer le tableau sur la demande et le retourner:

class YourClass { 
    private static $values = NULL; 
    private static function values() { 
     if (self::$values === NULL) { 
      self::$values = array(
       'value1', 
       'value2', 
       'value3', 
      ); 
     } 
     return self::$values; 
    } 
} 
+0

+1: technique très utile, je l'ai fait plusieurs fois moi-même. – Jon

+0

Puis-je remplir le tableau et l'utiliser normalement pendant l'instanciation? – user151841

+1

Bien sûr, c'est possible. Je l'implémente généralement de cette façon pour les grands ensembles de données afin d'économiser de la mémoire pour le cas où la classe est chargée, mais le tableau n'est pas utilisé. – soulmerge

0

je mets des tableaux dans un autre fichier, puis inclure le fichier où je en ai besoin.

0

J'ai vraiment un vraiment difficile de comprendre votre question. Voici essentiellement ce que j'ai compris:

Je dois maintenir un ensemble approprié, où deux éléments ne sont pas identiques.

PHP n'a pas de type set, même pas en SPL! Nous pouvons émuler la fonctionnalité d'un ensemble, mais toute solution que je peux penser n'est pas agréable. Voici ce que je pense est la plus propre:

<?php 

class Set { 

    private $elements = array(); 

    public function hasElement($ele) { 
     return array_key_exists($ele, $elements); 
    } 

    public function addElement($ele) { 
     $this->elements[$ele] = $ele; 
    } 

    public function removeElement($ele) { 
     unset($this->elements[$ele]); 
    } 

    public function getElements() { 
     return array_values($this->elements); 
    } 

    public function countElements() { 
     return count($this->elements); 
    } 

} 

Exemple d'utilisation:

<?php 

$animals = new Set; 
print_r($animals->getElments()); 
$animals->addElement('bear'); 
$animals->addElement('tiger'); 
print_r($animals->getElements()); 
$animals->addElement('chair'); 
$animals->removeElement('chair'); 
var_dump($animals->hasElement('chair')); 
var_dump($animals->countElements()); 
+0

'Aucun élément n'est identique' n'est pas une fonctionnalité critique. Je dois juste m'assurer qu'un argument est membre d'un ensemble. Un peu de répétition n'est pas une affaire de tueur; mais penser que quelque chose est un membre quand il ne devrait pas l'être. – user151841

+0

Eh bien, désolé, je ne pouvais pas vous aider. Je ne pouvais pas comprendre et je n'arrive toujours pas à comprendre votre question. – erisco