2011-05-16 21 views
5

Tengo dos valores estáticos: "tipo" y "tipoID". El tipo es legible y constante, y el ID de tipo necesita buscarse desde la base de datos, según el valor del tipo. Necesito que la búsqueda se realice una vez, cuando la definición de clase se carga por primera vezCompletando dinámicamente una variable estática en PHP

Para ilustrar, aquí hay un código que no funciona porque no puede llamar funciones en el espacio de declaración.

MyClass extends BaseClass { 
    protected static $type = "communities"; 
    protected static $typeID = MyClass::lookupTypeID(self::$type); 
} 

¿Hay un método mágico que se llama exactamente una vez cuando se carga la definición de la clase? Si hay algo obvio, me lo estoy perdiendo.

+0

posible duplicado de [PHP: Cómo inicializar variables estáticas] (http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables) – webbiedave

+0

@webbiedave - eso es init y parece ser la misma causa raíz, pero yo diría que la pregunta es diferente. – slifty

+0

Poblar, inicializar. Tomate, tomate :) Creo que es lo mismo, pero dudo seriamente que se cierre en este punto de todos modos. – webbiedave

Respuesta

9

descaradamente sacó de los comentarios de la palabra clave estática del manual de PHP:

Because php does not have a static constructor and you may want to initialize static class vars, there is one easy way, just call your own function directly after the class definition. 

for example. 

<?php 
function Demonstration() 
{ 
    return 'This is the result of demonstration()'; 
} 

class MyStaticClass 
{ 
    //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error 
    public static $MyStaticVar = null; 

    public static function MyStaticInit() 
    { 
     //this is the static constructor 
     //because in a function, everything is allowed, including initializing using other functions 

     self::$MyStaticVar = Demonstration(); 
    } 
} MyStaticClass::MyStaticInit(); //Call the static constructor 

echo MyStaticClass::$MyStaticVar; 
//This is the result of demonstration() 
?> 
3

Simple y sin necesidad de magia, no olvide que siempre puede definir una variable como nula y probar que es nula (haciendo la llamada db solo entonces). Entonces es sólo una cuestión si se quiere que eso suceda cuando la clase se construye o se incluyó (include_once etc ...)

MyClass extends BaseClass { 
    protected static $type = "communities"; 
    protected static $typeID = null; 

    public function __construct(){ 
     if(is_null(self::$typeID)){ 
      self::lookupTypeID(self::$type); 
     } 
    } 

    public static lookupTypeID($type){ 
     self::$typeID = //result of database query 
    } 
} 

o

MyClass::lookupTypeID(); //call static function when class file is included (global space) 

MyClass extends BaseClass { 
    protected static $type = "communities"; 
    protected static $typeID = null; 

    public function __construct(){ 

    } 

    public static lookupTypeID($type=null){ 
     if(is_null($type)){ 
      $type = self::$type; 
     } 
     self::$typeID = //result of database query (SELECT somefield FROM sometable WHERE type=$type) etc.. 
    } 
} 

un constructor estático es más como un método de fábrica

if(!function_exists(build_myclass)){ 
    function build_myclass(){ 
     return MyClass::build(); 
    } 
} 

MyClass extends BaseClass { 
    protected static $type = "communities"; 
    protected static $typeID = null; 

    public function __construct(){ 

    } 

    public static function build(){ 
     return new self(); //goes to __construct(); 
    } 

} 

$class = new MyClass(); //or 
$class = MyClass::build(); //or 
$class = build_myclass(); 
Cuestiones relacionadas