2011-05-16 13 views
5

Mam dwie wartości statyczne: "type" i "typeID". Typ jest czytelny dla człowieka i stały, a typID musi być sprawdzony z bazy danych, na podstawie wartości typu. Potrzebuję do tego celu, kiedy definicja klasy zostanie najpierw załadowana.Dynamiczne zapełnianie zmiennej statycznej w PHP

Oto przykład kodu, który nie działa, ponieważ nie można wywoływać funkcji w obszarze deklaracji.

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

Czy istnieje magiczna metoda, która jest wywoływana dokładnie jeden raz podczas ładowania definicji klasy? Jeśli jest coś oczywistego, brakuje mi tego.

+0

możliwe duplikat [PHP: Jak zainicjować zmienne statyczne] (http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables) – webbiedave

+0

@webbiedave - to o metodzie init ializacja i tak się składa, że ​​jest to ta sama główna przyczyna, ale twierdzę, że to pytanie jest inne. – slifty

+0

Zapełnianie, inicjowanie. Pomidor, pomidor :) Myślę, że to to samo, ale poważnie wątpię, że i tak zostanie zamknięta w tym momencie. – webbiedave

Odpowiedz

9

bezwstydnie wyciągnął z uwagi na słowa kluczowe statycznych instrukcji 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

Proste i bez magii potrzebne, nie zapominaj, że zawsze możesz zdefiniować zmienną jako wartość NULL i sprawdzić, czy jest ona zerowa (wywołując tylko wywołanie db). Wtedy to tylko kwestia, czy chcesz aby tak się stało, gdy klasa jest skonstruowany lub włączone (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 
    } 
} 

lub

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.. 
    } 
} 

statyczny konstruktor jest bardziej podobny do metody fabryki

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(); 
Powiązane problemy