2011-05-16 2 views
5

У меня есть два статических значения: «type» и «typeID». Тип является читаемым человеком и постоянным, а typeID необходимо искать из базы данных на основе значения типа. Мне нужно, чтобы поиск выполнялся один раз, когда сначала задано определение классаДинамическое заполнение статической переменной в PHP

Чтобы проиллюстрировать это, вот какой-то код, который не работает, потому что вы не можете вызывать функции в пространстве декларации.

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

Есть ли волшебный метод, который называется ровно один раз, когда загружается определение класса? Если есть что-то очевидное, я пропущу его.

+0

возможно дубликат [PHP: Как инициализировать статические переменные] (http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables) – webbiedave

+0

@webbiedave - это о INIT ialization, и это, случается, одна и та же первопричина, но я бы сказал, что вопрос другой. – slifty

+0

Заполнение, инициализация. Помидор, помидор :) Я думаю, что это одно и то же, но я серьезно сомневаюсь, что в любом случае он будет закрыт. – webbiedave

ответ

9

безбожно вытащило из статичных ключевых слов комментариев РНР руководства:

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() 
?> 
1

Такой вещь, как правило, называют «статический конструктор», но PHP не хватают таких вещей. Возможно, вы захотите рассмотреть один из обходных решений, предложенных в комментариях к PHP, например. http://www.php.net/manual/en/language.oop5.static.php#95217

3

Простая и не требующая магии, не забывайте, что вы всегда можете определить переменную как нуль и проверить, что она равна нулю (тогда выполняется только вызов db). Тогда это просто вопрос, если вы хотите, чтобы это произошло, когда класс построен или включен (include_once и т.д ...)

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

или

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

статический конструктор больше похож на фабричный метод

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(); 
Смежные вопросы