spl_autoload_register vs __autoload

时间:2012-04-28 18:55:58

标签: php

我试试

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。

3 个答案:

答案 0 :(得分:4)

按顺序调用自动加载函数,首先调用第一个注册函数,然后调用第二个函数,依此类推,直到其中一个找到该类 (除非使用$prepend)。如果没有,则触发致命错误。

但是,在您的示例中,您使用的是require而不是include,因此如果文件不存在,第一个函数将始终失败并发生致命错误,因此第二个函数将永远不会叫做。即使用include替换它,如果两个文件都存在,也只会调用第一个注册的函数。

使用多个自动加载功能时,最好使用file_existsinclude

您还可以在自动加载功能中抛出异常,这样您就可以优雅地处理未定义的类,而不是在找不到类时杀死脚本。每个例子:

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提供比前者更多的灵活性。

答案 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();
?>

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