2011-05-16 14 views
5

"type"と "typeID"の2つの静的値があります。 Typeは人間が読み取り可能で定数で、typeIDの値に基づいてデータベースからtypeIDを参照する必要があります。クラス定義が最初にロードされるときに参照が必要です。PHPで静的変数を動的に設定する

説明すると、宣言空間で関数を呼び出すことができないため、ここでは機能しないコードがあります。

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

クラス定義がロードされたときに1回だけ呼び出されるマジックメソッドがありますか?明白なことがあれば私はそれを逃している。

+0

[PHP:どのように静的変数を初期化する]の可能複製(http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables) – webbiedave

+0

@webbiedaveは - それは初期化についてです同じ根本原因が起きていますが、私はその質問が異なっていると主張します。 – slifty

+0

入力、初期化。トマト、トマト:)私はそれは同じだと思うが、私は真剣にそれがとにかくこの時点で閉じられるだろうと疑う。 – webbiedave

答えて

9

臆面もなく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() 
?> 
1

このような事は、通常、「静的コンストラクタ」と呼ばれますが、PHPは、このようなものが欠けています。 PHPマニュアルのコメントで提案されている回避策の1つを考えてみてください。 http://www.php.net/manual/en/language.oop5.static.php#95217

3

シンプルで魔法は必要ありません。あなたはいつも変数をnullとして定義し、ヌルであることをテストできることを忘れないでください(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(); 
関連する問題