我试试
function some_class($class) {
require PATH.'test'.$class.'.php';
}
function test_class($class) {
require PATH.'some'.$class.'.php';
}
spl_autoload_register("test_class");
spl_autoload_register("some_class");
$tst = new SomeClass();
SomeClass类位于“PATH / some / SomeClass.php”中,但是spl_autoload_register只调用“test_class”函数而不调用“some_class”。但如果我改变函数位置,那么它会找到新的SomeClass。
答案 0 :(得分:4)
按顺序调用自动加载函数,首先调用第一个注册函数,然后调用第二个函数,依此类推,直到其中一个找到该类
(除非使用$prepend
)。如果没有,则触发致命错误。
但是,在您的示例中,您使用的是require
而不是include
,因此如果文件不存在,第一个函数将始终失败并发生致命错误,因此第二个函数将永远不会叫做。即使用include
替换它,如果两个文件都存在,也只会调用第一个注册的函数。
使用多个自动加载功能时,最好使用file_exists
或include
。
您还可以在自动加载功能中抛出异常,这样您就可以优雅地处理未定义的类,而不是在找不到类时杀死脚本。每个例子:
function my_autoload($class) {
$filename = "class.{$class}.php";
if (!file_exists($filename))
throw new Exception("$class not found");
include_once $filename;
}
spl_autoload_register('my_autoload');
try {
$a = new Foo;
} catch (Exception $e) {
// Foo wasn't found
}
// continuing the script...
显然这取决于您的需求,因为抛出异常会停止后续自动加载功能的执行。
最后,它不鼓励使用__autoload
,spl_autoload_register
提供比前者更多的灵活性。
答案 1 :(得分:1)
你最好只使用一个自动加载功能。像这样:
function some_class($class) {
if (file_exists(PATH.'test'.$class.'.php')) {
include PATH.'test'.$class.'.php';
} elseif (file_exists(PATH.'some'.$class.'.php')) {
include PATH.'some'.$class.'.php';
} else {
die('class '.$class.' not found');
}
}
spl_autoload_register("some_class");
答案 2 :(得分:0)
spl_autoload_register- 究竟是什么意思?让我们试着通过一个例子来理解它:
function Autoloader($className)
{
require_once $path.$className.'.php';
}
spl_autoload_register('Autoloader');
$myObj = new MyClass();
这里我们刚刚实例化了一个名为“MyClass”的类,没有指定include或require语句。
不是很酷吗?那我们怎么做呢?让我们深入挖掘。
这里我们用spl_autoload_register()函数注册了一个名为“Autoloader”的函数。当我们实例化“MyClass”时,类名(MyClass)被PHP传递给“spl_autoload_register()”,其中注册函数将其作为参数选取。在定义Autoloader功能时,我们已经包含了该类文件的路径。
这简直太棒了!!想想一下你有几个课程的情况,所有这些课程都不会在每个案例或每个页面上使用。在这种情况下,spl_autoload_register()可以成为你真正的救世主。
你只需要实例化,并且spl_autoload_register()将负责休息。
您可以按照以下方式执行此操作,而不是注册功能:
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
但是这段代码只适用于PHP> = 5.3.0
您可以将spl_autoload_register()视为__autoload()的替代,可以将其定义为:
__ autoload() - 尝试加载未定义的类
让我们试着通过一个例子来理解。
<?php
// we've writen this code where we need
function __autoload($classname) {
$filename = "./". $classname .".php";
include_once($filename);
}
// we've called a class ***
$obj = new myClass();
?>
但是它有一个缺点,你需要在每个类文件中编写这个函数。