デストラクタの利用に関する規約
2008年1月10日
デストラクタ処理ルーチンがほぼ完成。デストラクタは、次の規約に沿って利用するようにする。それぞれのクラスでオブジェクトのインスタンスが一つだけ必要な場合、$objという名でスタティックに作成する。
1)プラグイン
基本的に、プラグインのデストラクタは、他のプラグインのオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、ライブラリの各機能は使用可能。
2)ライブラリ(sqlクラス・coreクラスを除く)
基本的に、ライブラリオブジェクトのデストラクタは、他のライブラリオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、sqlクラス・coreクラスは利用可能。
3)sqlクラス
coreクラス以外のライブラリのオブジェクトに依存しないこと。
4)coreクラス
いかなるオブジェクトにも依存しないこと。
coreクラスに次のメソッドを用意した。
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);』を実行するようにする。