車輪の再発明になっている可能性大な気がしますが、PHP4で動作する、動的な簡易クラスローダを作成してみました。
大まかにはZend FrameworkのZend_Loaderを参考にしていますが、基本的に1から書き直していています。
PHP:
<?php
/**
* 簡易クラスローダ
* for PHP4
*
* @author anon <anon@anoncom.net>
*/
class ClassLoader
{
function ClassLoader() {}
/**
* 指定されたクラスを読み込み、インスタンスを返します。
*
* @param string $class クラス名
* @param string|NULL クラスディレクトリ
* @param boolean $once requireでファイルを読み込む際に、require_onceで読み込むか否か
* @param array|NULL $param インスタンス生成時に引き渡す引数
* @param string|NULL $loaderMethod インスタンス生成時に呼び出される、コンストラクタ以外のメソッド名(Singletonパターンでの呼び出しの場合など)
*/
function loadClass($class, $dir = NULL, $once = TRUE, $params = NULL, $loaderMethod = NULL)
{
$classfile_exists = false;
foreach($dirs as $dir){
$filepath = $dir . '/' . $class . '.php';
if(Froute_Loader::isFileAvailable($filepath)){
$classfile_exists = true;
break;
}
}
if(!$classfile_exists){
trigger_error('could not load class, causes class file"' .
$class .
'" is not found.',
E_USER_WARNING);
}
}else{
$filepath = $dir . '/' . $class . '.php';
if(!ClassLoader::isFileAvailable($filepath)){
trigger_error('could not load class, causes class file "' .
$filepath .
'" is not found.',
E_USER_ERROR);
}
}
if($once){
require_once $filepath;
}else{
require $filepath;
}
trigger_error('could not load class, causes undefined class name "' .
$class .
'".',
E_USER_ERROR);
}
trigger_error('could not load class, causes undefined function name "' .
$class .
'".',
E_USER_ERROR);
}
}else{
}
}else{
/*
if(!function_exists($class)){
trigger_error('could not load class, \'causes undefined function name "' . $class . '".', E_USER_ERROR);
}
*/
$instance = new $class;
}else{
//$instance = new call_user_func($class, $params); // to use php5
$instance = new $class($params); // to use php4
}
}
return $instance;
}
/**
* ファイルが存在するか確認します
*
* @param string $filename
* @return bool
*/
function isFileAvailable($filename)
{
return true;
}else{
return false;
}
}
}
使い方は以下の通り
(続きを読む...)