我工作的一个自定义的框架的发展。 我曾经遇到过一个问题,当我试图dynamise我的课的调用。
这是一个视觉的我的文件:
所以决定为每个文件夹创建不同的功能(LIBS,控制器等MODELES):
function autoloadLibs($class) {
//require the general classes
require 'libs/' . $class . '.php';
}
function autoloadModels($class) {
//require the models classes
require 'models/' . $class . '.php';
}
function autoloadControllers($class) {
//require the controllers classes
require 'controllers/' . $class . '.php';
}
spl_autoload_register ('autoloadLibs');
spl_autoload_register ('autoloadControllers');
spl_autoload_register ('autoloadModels');
不过,我有这样的信息: 警告:要求(库/ admin.php的):未能打开流 ,赛道的它不是好的文件夹。 但我不知道如何解决这个问题。 是否有优化我的班来电的好方法?
一些测试后,我发现这个解决方案为我的情况:
set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './libs', './controllers', './models')));
spl_autoload_register();
你需要检查的文件,第一存在is_file()
在尝试之前require
它。
当使用spl_autoload_register()
我发现它通常是更好地注册一个方法中包含的文件。 你能兵多种功能,我相信事实是,以与不同的库易互通(这样它们就不会破坏__autoload()
它也将节省您不必多次编写代码以检查文件的存在,地图_
以目录分隔符(如果你这样做),等等。
因此,假设你改变你的文件名,以适应该公约Underscore_Separated_Name
,如Controller_Admin_Dashboard
,您可以使用...
function autoload($className) {
$path = SYSPATH .
str_replace("_", DIRECTORY_SEPARATOR, strtolower($className)) .
".php";
if (is_file($path)) {
require $path;
}
}
你实例第一次Controller_Admin_Dashboard
,PHP可以包括文件如/app/controller/admin/dashboard.php
。
如果您有多个spl_autoload_register
叫你需要确保你不使用require
关键字中包含的文件,因为这意味着“包含的文件,或者如果它不能死”。
我个人与他人不同意只具有一个自动加载的功能,特别是如果你是包括从不同的地点,如控制器与一些图书馆目录中的类。 我还检查文件是否存在第一, 然后包括它。
TL;博士版本:不允许spl_autoload_register
呼吁阻止对方。
你的答案就在这里。 当您注册多个自动加载机,PHP试图通过这些自动加载任何加载类, 然后调用PHP从第一个注册到最后那些自动加载。 然后 ,在这些自动加载机的一个人,你应该检查file_exists与否, 否则 ,PHP的尝试包括它,如果该文件不存在,抛出一个错误。 随后 ,包括前,检查文件的所有脑干。 改变你的自动加载到:
function autoloadLibs($class)
{
#require the general classes
$file = 'libs/' . $class . '.php';
if(file_exists($file))
require $file;
}
function autoloadModels($class)
{
#require the models classes
$file = 'models/' . $class . '.php';
if(file_exists($file))
require $file;
}
function autoloadControllers($class)
{
#require the controllers classes
$file = 'controllers/' . $class . '.php';
if(file_exists($file))
require $file;
}
要求文件,例如之前,您应检查类名:
function autoloadControllers($class) {
//require the controllers classes
if( substr( $class, -10) == 'Controller')){
require 'controllers/' . $class . '.php';
}
}
我觉得正确导致错误,如果类不能被加载,但你应该确保require
被称为只在正确的道路。
需要注意的是spl_autoload_register
提供了第三个参数( prepend
)。 你可以将其设置为true
,如果你想放置特定的自动加载功能的自动加载堆栈的顶部。 这意味着,这个特定的功能将被首先调用。
例:
spl_autoload_register(阵列( 'My_Class', 'My_Method'),真,TRUE);
http://www.php.net/manual/en/function.spl-autoload-register.php