嗨,我正在为吉他和弦开发一个库。在库中的一些文件中我有这样的东西:
require_once "lib/GuitarChord.php";
require_once "lib/Chord.php";
require_once "lib/Key.php";
require_once "lib/Tuning.php";
如何创建此库,以便不需要知道其他库文件的 where ?
这样一个人可以在任何目录中拥有库文件吗?
编辑:删除了第二个问题。
答案 0 :(得分:7)
为可能存在这些类的所有位置创建自动加载器。
例如:
//AUTOLOADER
function class_autoloader($class) {
// presumes classes are in './classes'
$folders = array(
'./', './../', './../../'
);
$directories = array(
'classes','lib', ''
);
$dir = dirname(__FILE__);
$theClass = '/' . $folderedClass . '.php';
foreach($folders as $folder){
foreach($directories as $directory){
$theInclude = $dir.$folder.$directory.$theClass;
if (file_exists($theInclude) && include_once($theInclude)) {
return TRUE;
}
}
}
trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING);
return FALSE;
}
spl_autoload_register('class_autoloader');
然后,如果您要加载Chord
类,并且您知道它位于lib
文件夹中,则自动加载器将为您执行以下操作:
new Chord();
附加许多不同的自动加载器回调
答案 1 :(得分:1)
如果您的库使用了所有或大多数包含的类,那么请考虑将与库相关的所有类放在同一个文件中。其他解决方案只需要添加更多代码,在这种情况下,你应该坚持使用当前的方法。
如果您希望将文件拆分用于开发目的,那么一定要继续这样做,但您仍然可以将其打包到一个文件中以供生产使用,以便人们轻松包含。
答案 2 :(得分:1)
如果您不想在一个文件中包含所有类,则必须包含文件夹名称。您可以将其设置为用户只需设置一次的地方,但是:
$lib_folder = "lib";
require_once $lib_folder . "/GuitarChord.php";
require_once $lib_folder . "/Chord.php";
require_once $lib_folder . "/Key.php";
require_once $lib_folder . "/Tuning.php";
至于处理不同类型的数据库,你可以创建另一个设置,如$ db_type,用户可以设置为“MYSQL”,“FILE”,“XML”等。在你调用db的地方,使用一个切换语句以查看他们正在使用的数据库方法并相应地更改您的呼叫。
编辑:还值得研究PHP's __autoload feature
答案 3 :(得分:0)
您可能想尝试Zend AutoLoader
。
答案 4 :(得分:0)
您应该查看namespaces和autoloaders。
假设您已将所有课程都放在'GuitarChords'命名空间中 - 因此您可以创建类似于以下内容的自动加载功能(假设文件,您注册自动加载器的位置在“lib”的父目录中):
spl_autoload_register(function($class){
$namespace = explode('\\', $class, 2);
if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) {
include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php');
}
});
我认为最好为每个库集/名称空间注册一个自动加载功能。 迭代目录并使用include_once,file_exists等可能会产生一些令人讨厌的IO开销,具体取决于系统的复杂性。