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)
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.
如果您有多个spl_autoload_register调用,您需要确保不使用require关键字来包含文件,因为这意味着“包含文件或如果不能包含则死亡”。
我个人不同意其他人关于只有一个自动加载功能的观点,尤其是当您包含来自不同位置的类时,例如控制器与某个库目录。我还先检查文件是否存在,然后包含它。
tl;dr 版本:不允许spl_autoload_register呼叫相互阻止。