2012-05-27 18 views
19

¿puede inicializar una matriz estática de objetos en una clase en PHP? Como se puede hacerPHP: defina la matriz estática de objetos

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

pero cuando lo hago

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

donde MyOtherClass se define justo encima miclase. Eso arroja un error sin embargo; ¿Hay alguna manera de lograrlo?

+0

Podría decirnos que el error es? – xbonez

+4

Establezca '$ blah2' dentro del constructor. No puede establecer valores calculados en tiempo de ejecución en una definición de propiedad. – Wiseguy

+0

@Wiseguy recibí su mensaje ¿verdad? – Brett

Respuesta

24

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

Al igual que cualquier otra variable estática PHP, propiedades estáticas sólo pueden ser inicializar utilizando un literal o constante; las expresiones no están permitidas Por lo tanto, aunque puede inicializar una propiedad estática en un entero o matriz (por ejemplo), no puede inicializarla a otra variable, a un valor de retorno de la función , oa un objeto.

Me inicializar la propiedad a null, hacerlo privado con un método de acceso, y tienen el descriptor de acceso hacer la inicialización "real" la primera vez que se llama. He aquí un ejemplo:

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

Aunque no se puede inicializar a tener estos valores, puede llamar a un método estático para empujarlos a su propia colección interna, como lo he hecho a continuación. Esto puede ser lo más cerca que puedas llegar.

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

Demostración: http://codepad.org/InTPdUCT

que se traduce en la siguiente salida:

Array 
(
    [0] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [1] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
    [2] => foo Object 
    (
     [bar] => fizzbuzz 
    ) 
)
Cuestiones relacionadas