我尝试使用spl_autoload_register函数自动加载我的类。我已经得到它的工作,但仍然收到大量这样的警告消息:"警告:include_once(application / models / controller.class.php):无法打开流:没有这样的文件或目录.. "
我知道我需要使用file_exists方法以某种方式修复此问题,但我不确定如何将其包含在我的代码中:
<?php
function myLoad($class) {
include_once('application/controllers/'.$class.'.class.php');
include_once('application/models/'.$class.'.class.php');
include_once('application/'.$class.'.class.php');
}
spl_autoload_register('myLoad');
new controller();
?>
我将其更改为此并且现在正在运行,但有更简单/更简洁的方法吗?这似乎有点重复
function myLoad($class) {
if (file_exists('application/controllers/'.$class.'.class.php')){
include_once('application/controllers/'.$class.'.class.php');
}
if (file_exists('application/models/'.$class.'.class.php')){
include_once('application/models/'.$class.'.class.php');
}
if (file_exists('application/'.$class.'.class.php')){
include_once('application/'.$class.'.class.php');
}
}
spl_autoload_register('myLoad');
答案 0 :(得分:1)
使用循环是使其更简洁的方法之一。将所有可能性放入数组中,循环遍历数组,并在包含文件后返回。在这种情况下,找到的第一个项目将被使用。
$paths = [
'application/controllers/'.$class.'.class.php',
'application/models/'.$class.'.class.php',
'application/'.$class.'.class.php'
];
foreach($paths as $path) {
if (file_exists($path)) {
include_once($path);
return;
}
}
然而,我建议不要自己构建自动加载器,而是要使用PSR-4标准并使用作曲家。
答案 1 :(得分:0)
为了解决这些问题,我想枚举一个匿名数组:
function myLoad($class) {
foreach(['controllers', 'models', ''] as $prefix) {
if(file_exists("application/$prefix/$class.class.php"))
include_once("application/$prefix/$class.class.php");
}
}
spl_autoload_register('myLoad');
请注意,如果你把这样的字符串放在一起,那么对于没有前缀的情况,你会有一个双斜线,但这不应该有所作为。 我发现它更具可读性。