多个spl_autoload_register问题

Adr*_*n G 8 php class spl-autoload-register

我正在开发自定义框架.当我试图动态调用我的类时,我遇到了一个问题.

这是我的文件的视觉效果:

在此输入图像描述

所以我决定为每个文件夹(libs,controllers和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');
Run Code Online (Sandbox Code Playgroud)

不过我有这样的消息:警告:require(libs/admin.php):无法打开流,cours它不是好文件夹.但我不知道如何解决这个问题.有没有一种优化我的类调用的好方法?

Adr*_*n G 11

经过几次测试,我找到了适合我案例的解决方案:

set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './libs', './controllers', './models')));
spl_autoload_register();
Run Code Online (Sandbox Code Playgroud)


ale*_*lex 5

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

第一次实例化时Controller_Admin_Dashboard,PHP可能包含一个文件,如/app/controller/admin/dashboard.php.


Leo*_*lis 5

如果您有多个spl_autoload_register调用,您需要确保不使用require关键字来包含文件,因为这意味着“包含文件或如果不能包含则死亡”

我个人不同意其他人关于只有一个自动加载功能的观点,尤其是当您包含来自不同位置的类时,例如控制器与某个库目录。我还先检查文件是否存在,然后包含它。

tl;dr 版本:不允许spl_autoload_register呼叫相互阻止。