7

我已经阅读了有关在需要时在这样的函数中动态加载类文件的信息:

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

$obj = new DB();

当您创建该类的新实例时,它会自动加载DB.class.php,但我还在几篇文章中读到使用它是不好的,因为它是一个全局函数,并且您带入项目的任何具有__autoload()函数的库都会弄乱它向上。

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

谢谢。

4

6 回答 6

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;
    }

}

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

于 2010-04-13T15:06:30.963 回答
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;
于 2010-04-13T15:05:54.993 回答
4

正确的方法是使用spl_autoload_register. 要保存__autoload某个第 3 方引入的函数,您也可以将该函数放在自动加载器堆栈中:

if (function_exists('__autoload')) {
    spl_autoload_register('__autoload');
}
于 2010-04-13T15:05:59.620 回答
3

使用 spl_autoload_register 而不是 __autoload。这将允许您将自动加载功能添加到堆栈中。

于 2010-04-13T14:57:13.337 回答
0

你可以使用Zend_Loader。(假设 Zend Framework 可供您使用……)

于 2010-04-13T15:00:37.490 回答
0

您可以做的最好的事情是定义自己的对象,负责为您正在编程的任何子系统自动加载。

例如:

class BasketAutoloader
{
  static public function register()
  {
    spl_autoload_register(array(new self, 'autoload'));
  }

  public function autoload($class)
  {
    require dirname(__FILE__).'/'.$class.'.php';
  }
}
于 2010-04-13T16:19:13.693 回答