2012-05-27 16 views
19

è possibile inizializzare una matrice statica di oggetti in una classe in PHP? Come si può farePHP: definisce la matrice statica di oggetti

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

ma quando lo faccio

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

dove myotherclass è definito proprio sopra myclass. Ciò tuttavia genera un errore; c'è un modo per raggiungerlo?

+0

Puoi dirci che l'errore è? – xbonez

+4

Imposta '$ blah2' all'interno del costruttore. Non è possibile impostare valori calcolati in fase di esecuzione in una definizione di proprietà. – Wiseguy

+0

@Wiseguy ho ricevuto il messaggio giusto? – Brett

risposta

24

No. Da http://php.net/manual/en/language.oop5.static.php:

Come qualsiasi altra variabile statica PHP, proprietà statiche possono essere inizializzate solo con un letterale o costante; le espressioni non sono permesse. Quindi, mentre è possibile inizializzare una proprietà statica su un numero intero o array (ad esempio), non è possibile inizializzarlo su un'altra variabile, su un valore di ritorno della funzione o su un oggetto.

avrei inizializzare la proprietà per null, renderlo privato con un metodo di accesso, e hanno la funzione di accesso fare l'inizializzazione "reale" la prima volta che si chiama. Ecco un esempio:

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()); 
1

Anche se non è possibile inizializzare di avere questi valori, è possibile chiamare un metodo statico a spingerli nella propria raccolta interna, come ho fatto qui di seguito. Questo potrebbe essere il più vicino possibile.

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); 

Demo: http://codepad.org/InTPdUCT

che si traduce nella seguente output:

Array 
(
    [0] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [1] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [2] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
)
Problemi correlati