シンプルで魔法は必要ありません。あなたはいつも変数を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();
[PHP:どのように静的変数を初期化する]の可能複製(http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables) – webbiedave
@webbiedaveは - それは初期化についてです同じ根本原因が起きていますが、私はその質問が異なっていると主張します。 – slifty
入力、初期化。トマト、トマト:)私はそれは同じだと思うが、私は真剣にそれがとにかくこの時点で閉じられるだろうと疑う。 – webbiedave