2011-06-28 18 views
5

Estoy tratando de declarar una variable estática pública que es una matriz de matrices:Público valor de la variable estática

class Foo{ 
public static $contexts = array(
    'a' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

    'b' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

); 

// methods here 

} 

function something($s){ 
    return ... 
} 

pero me da un error:

Parse error: parse error, expecting `')'' in ...

+0

¿Qué es 'something()'? Además, ¿se declara esto como una propiedad de clase ('public static $ contexts') o en algún lugar de un método? – deceze

+0

es una función normal ... está declarada fuera de la clase. la variable se declara como una propiedad de clase – Alex

+0

"declarada fuera de la clase"? ¿Podemos ver dónde está este fragmento de código con el resto de la clase? – BoltClock

Respuesta

9

No puede utilizar expresiones al declarar propiedades de clase. Es decir. no puede llamar al something() aquí, solo puede usar valores estáticos. Tendrá que establecer esos valores de manera diferente en el código en algún momento.

Like any other PHP static variable, static properties may only be initialized using a literal or constant; expressions are not allowed. So while you may initialize a static property to an integer or array (for instance), you may not initialize it to another variable, to a function return value, or to an object.

http://www.php.net/manual/en/language.oop5.static.php

Por ejemplo:

class Foo { 
    public static $bar = null; 

    public static function init() { 
     self::$bar = array(...); 
    } 
} 

Foo::init(); 

o hacerlo en __construct si va a crear una instancia de la clase.

+0

eso es extraño, porque puedo declarar una función pública estática que devolverá mi matriz, sería la misma – Alex

+1

Los valores iniciales de las propiedades de clase se crean mientras se analiza el código fuente. En ese punto, la memoria debe reservarse para esos valores de clase iniciales, ya que deben almacenarse en algún lugar. Esto sucede antes de que el código se ejecute realmente. Sin embargo, no puede reservar memoria para el valor de retorno de una función, ya que una función puede devolver cualquier cosa. Y dado que el análisis no se ha completado, las funciones aún no se pueden ejecutar. Por lo tanto, mientras * analiza * el código, solo se permiten los valores estáticos de tamaño conocido. Una función se invoca (explícitamente) más tarde en el tiempo de ejecución y puede devolver cualquier cosa. – deceze

Cuestiones relacionadas