首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spl_autoload_register vs __autoload

spl_autoload_register vs __autoload
EN

Stack Overflow用户
提问于 2012-04-29 02:55:58
回答 3查看 2.2K关注 0票数 1

我试着

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-29 03:13:44

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

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

在使用多个自动加载函数时,最好使用file_existsinclude

您还可以在autoload函数中抛出异常,以便可以优雅地处理未定义的类,而不是在找不到类时终止脚本。每个示例:

代码语言:javascript
复制
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函数的执行。

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-29 03:15:15

你最好只使用一个自动加载函数。如下所示:

代码语言:javascript
复制
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");
票数 1
EN

Stack Overflow用户

发布于 2015-05-18 15:20:56

spl_autoload_register-它到底是什么意思?让我们通过一个例子来尝试理解它:

代码语言:javascript
复制
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()将负责处理rest。

除了注册函数之外,您还可以按如下方式进行注册:

代码语言:javascript
复制
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

但是这段代码只能在>= 5.3.0上运行

您可以将spl_autoload_register()视为__autoload()的替代,它可以定义为:

__autoload() -尝试加载未定义的类

让我们试着通过一个例子来理解。

代码语言:javascript
复制
<?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();
?>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10366560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档