web-dev-qa-db-fra.com

PHP - définir un tableau statique d'objets

pouvez-vous initialiser un tableau statique d'objets dans une classe en PHP? Comme tu peux le faire

class myclass {
    public static $blah = array("test1", "test2", "test3");
}

mais quand je fais

class myclass {
    public static $blah2 = array(
        &new myotherclass(),
        &new myotherclass(),
        &new myotherclass()
    );
}

où myotherclass est défini juste au-dessus de myclass. Cela jette cependant une erreur; existe-t-il un moyen d'y parvenir?

22
user1181950

Nan. De http://php.net/manual/en/language.oop5.static.php :

Comme toute autre PHP variable statique, les propriétés statiques ne peuvent être initialisées qu'en utilisant un littéral ou une constante; les expressions ne sont pas autorisées. Ainsi, alors que vous pouvez initialiser une propriété statique en un entier ou un tableau (par exemple) , vous ne pouvez pas l'initialiser dans une autre variable, dans une valeur de retour de fonction ou dans un objet.

Je voudrais initialiser la propriété à null, la rendre privée avec une méthode d'accesseur et demander à l'accesseur de faire l'initialisation "réelle" la première fois qu'il est appelé. Voici un exemple:

    class myclass {

        private static $blah2 = null;

        public static function blah2() {
            if (self::$blah2 == null) {
               self::$blah2 = array( new myotherclass(),
                 new myotherclass(),
                 new myotherclass());
            }
            return self::$blah2;
        }
    }

    print_r(myclass::blah2());
26
Mark Reed

Bien que vous ne puissiez pas l'initialiser pour avoir ces valeurs, vous pouvez appeler une méthode statique pour les pousser dans sa propre collection interne, comme je l'ai fait ci-dessous. Cela peut être aussi proche que possible.

class foo {
  public $bar = "fizzbuzz";
}

class myClass {
  static public $array = array();
  static public function init() {
    while ( count( self::$array ) < 3 )
      array_Push( self::$array, new foo() );
  }
}

myClass::init();
print_r( myClass::$array );

Démo: http://codepad.org/InTPdUCT

Ce qui se traduit par la sortie suivante:

Tableau 
 (
 [0] => foo Object 
 (
 [Bar] => fizzbuzz 
) 
 [1] => Objet foo 
 (
 [bar] => fizzbuzz 
) 
 [2] => Objet foo 
 (
 [bar] => fizzbuzz 
) 
)
3
Sampson