多spl_autoload_register问题(multiple spl_autoload_reg

2019-08-01 13:20发布

我工作的一个自定义的框架的发展。 我曾经遇到过一个问题,当我试图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的):未能打开流 ,赛道的它不是好的文件夹。 但我不知道如何解决这个问题。 是否有优化我的班来电的好方法?

Answer 1:

一些测试后,我发现这个解决方案为我的情况:

set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './libs', './controllers', './models')));
spl_autoload_register();


Answer 2:

你需要检查的文件,第一存在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



Answer 3:

如果您有多个spl_autoload_register叫你需要确保你不使用require关键字中包含的文件,因为这意味着“包含的文件,或者如果它不能死”。

我个人与他人不同意只具有一个自动加载的功能,特别是如果你是包括从不同的地点,如控制器与一些图书馆目录中的类。 我还检查文件是否存在第一, 然后包括它。

TL;博士版本:不允许spl_autoload_register呼吁阻止对方。



Answer 4:

你的答案就在这里。 当您注册多个自动加载机,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;
}


Answer 5:

要求文件,例如之前,您应检查类名:

function autoloadControllers($class) {
    //require the controllers classes
    if( substr( $class, -10) == 'Controller')){
        require 'controllers/' . $class . '.php';
    }
}

我觉得正确导致错误,如果类不能被加载,但你应该确保require被称为只在正确的道路。



Answer 6:

需要注意的是spl_autoload_register提供了第三个参数( prepend )。 你可以将其设置为true ,如果你想放置特定的自动加载功能的自动加载堆栈的顶部。 这意味着,这个特定的功能将被首先调用。

例:

spl_autoload_register(阵列( 'My_Class', 'My_Method'),真,TRUE);

http://www.php.net/manual/en/function.spl-autoload-register.php



文章来源: multiple spl_autoload_register issue