替换PHP的__autoload函数?

Jos*_*osh 7 php class autoload libraries

我已经阅读过关于在需要时动态加载类文件的内容,如下所示:

function __autoload($className)
{
   include("classes/$className.class.php");
}

$obj = new DB();
Run Code Online (Sandbox Code Playgroud)

DB.class.php当你创建该类的新实例时会自动加载,但我也读过几篇文章说使用它是不好的,因为它是一个全局函数,你带入项目的任何库都有一个__autoload()函数会弄乱它起来.

那么有人知道解决方案吗?也许另一种方式可以达到同样的效果__autoload()?在我找到合适的解决方案之前,我将继续使用,__autoload()因为它不会开始成为一个问题,直到您引入库等.

谢谢.

Kaz*_*zar 11

我已经使用以下代码来使用spl_autoload_register,如果它不存在则会降级,并且还处理使用__autoload的库,您需要包含它.

//check to see if there is an existing __autoload function from another library
if(!function_exists('__autoload')) {
    if(function_exists('spl_autoload_register')) {
        //we have SPL, so register the autoload function
        spl_autoload_register('my_autoload_function');      
    } else {
        //if there isn't, we don't need to worry about using the stack,
        //we can just register our own autoloader
        function __autoload($class_name) {
            my_autoload_function($class_name);
        }
    }

} else {
    //ok, so there is an existing __autoload function, we need to use a stack
    //if SPL is installed, we can use spl_autoload_register,
    //if there isn't, then we can't do anything about it, and
    //will have to die
    if(function_exists('spl_autoload_register')) {
        //we have SPL, so register both the
        //original __autoload from the external app,
        //because the original will get overwritten by the stack,
        //plus our own
        spl_autoload_register('__autoload');
        spl_autoload_register('my_autoload_function');      
    } else {
        exit;
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,该代码将检查现有的__autoload函数,并将其添加到堆栈以及您自己的函数(因为spl_autoload_register将禁用正常的__autoload行为).


Ann*_*rom 7

您可以使用spl_autoload_register(),向__autoload()堆栈添加任何现有的魔法.

function my_autoload( $class ) {    
    include( $class . '.al.php' );
}
spl_autoload_register('my_autoload');

if( function_exists('__autoload') ) {
    spl_autoload_register('__autoload');
}                                                                                         

$f = new Foo;
Run Code Online (Sandbox Code Playgroud)