Regulations

デストラクタの利用に関する規約

2008年1月10日

デストラクタ処理ルーチンがほぼ完成。デストラクタは、次の規約に沿って利用するようにする。それぞれのクラスでオブジェクトのインスタンスが一つだけ必要な場合、$objという名でスタティックに作成する。

1)プラグイン

 基本的に、プラグインのデストラクタは、他のプラグインのオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、ライブラリの各機能は使用可能。

2)ライブラリ(sqlクラス・coreクラスを除く)

 基本的に、ライブラリオブジェクトのデストラクタは、他のライブラリオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、sqlクラス・coreクラスは利用可能。

3)sqlクラス

 coreクラス以外のライブラリのオブジェクトに依存しないこと。

4)coreクラス

 いかなるオブジェクトにも依存しないこと。

 coreクラスに次のメソッドを用意した。
public function autoload($className){
    $this->loadedClasses[$className]=strtolower($className);
    …略…
}
public function __destruct(){
    self::shutdown($this);
}
static public function shutdown(&$obj){
    static $destructed;
    if (isset($destructed)) return;
    $excluded=strtolower(get_class($obj));
    // Unset objects
    $plugins=$libraries='';
    foreach(self::$obj->loadedClasses as $class=>$lcase){
        if ($lcase==$excluded) continue;
        if (substr($lcase,0,3)=='jp_') $plugins.="$class::\$obj=null;\n";
        elseif ($lcase!='sql') $libraries.="if (isset($class::\$obj)) $class::\$obj=null;\n";
    }
    eval($plugins.$libraries);
    if ($excluded!='sql') sql::$obj=null;
}
ライブラリオブジェクトのデストラクタで、『core::shutdown($this);』を実行するようにする。

コメント

コメントはありません

コメント送信