2012-05-27 22 views
19

czy możesz zainicjować statyczną tablicę obiektów w klasie w PHP? Jak można zrobićPHP - zdefiniuj statyczną tablicę obiektów

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

ale kiedy robię

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

gdzie myotherclass jest zdefiniowany tuż nad MojaKlasa. To jednak powoduje błąd; czy istnieje sposób, aby to osiągnąć?

+0

Czy możesz nam powiedzieć, że jest błąd? – xbonez

+4

Ustaw '$ blah2' w konstruktorze. Nie można ustawić wartości obliczanych w czasie wykonywania w definicji właściwości. – Wiseguy

+0

@Wiseguy czy otrzymałem wiadomość poprawnie? – Brett

Odpowiedz

24

Nie. Z http://php.net/manual/en/language.oop5.static.php:

jak innych zmiennych statycznych PHP właściwości elektrostatyczne mogą być inicjowane tylko przy dosłownym lub stała; wyrażenia są niedozwolone. Tak więc, mimo że można zainicjować właściwość statyczną na liczbę całkowitą lub tablicę (na przykład), nie można jej zainicjować inną zmienną, wartości zwracanej funkcji funkcji lub obiektu.

chciałbym zainicjować właściwość null, sprawiają, że prywatne z metody akcesor i mają accessor zrobić „prawdziwego” Inicjalizacja po raz pierwszy, to się nazywa. Oto przykład:

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

Chociaż nie można zainicjować go mieć te wartości, można wywołać metodę statyczną pchnąć je do własnej kolekcji wewnętrznego, jak zrobiłem poniżej. To może być tak blisko, jak to tylko możliwe.

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

co skutkuje w następujący wynik:

Array 
(
    [0] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [1] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [2] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
)
Powiązane problemy