1

我试试

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。

4

3 回答 3

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...

显然,这取决于您的需求,因为抛出异常将停止后续自动加载功能的执行。

最后,它完全不鼓励使用__autoloadspl_autoload_register提供了比前者更多的灵活性。

于 2012-04-28T19:13:43.663 回答
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");
于 2012-04-28T19:15:14.980 回答
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();
?>

但它有一个缺点,您需要在每个类文件中编写此函数。

于 2015-05-18T07:20:56.110 回答