Yii:autoload($ className)何时被调用?

时间:2014-05-04 18:56:44

标签: php yii autoload

我在__autoload课程中寻找YiiBase魔术方法,但它不是。在官方文档中说public static function autoload($className)

  

类自动加载器。提供此方法以在一个中调用   __autoload()魔法。

我很困惑。什么类yii框架包含__autoload魔法?是否可以通过组件类自动加载获得示例?

2 个答案:

答案 0 :(得分:1)

Yii使用spl_autoload_register功能设置自动加载器功能。 {5.1}引入了spl_autoload_register,使我们可以注册多个自动加载功能。它有效地创建了一个自动加载功能队列,并按照它们的定义顺序遍历每个功能。相比之下,__autoload()可能只定义一次。在Yii中,您可以在文件最后的YiiBase.php类的定义之后的YiiBase中找到它:

spl_autoload_register(array('YiiBase','autoload'));

其中autoload是在YiiBase类中定义的静态方法。

使用spl_autoload_register代替__autoload()魔术功能对我们有好处,因为这样Yii的自动加载器不会与我们自己的或与另一个第三方的自动加载器发生冲突。 YiiBase类还定义了一个registerAutoloader函数,用于在链中的Yii自动加载器之前或之后注册另一个自动加载器函数。如果你看看它的代码,它的作用非常简单:

public static function registerAutoloader($callback, $append=false)
{
    if($append)
    {
        self::$enableIncludePath=false;
        spl_autoload_register($callback);
    }
    else
    {
        spl_autoload_unregister(array('YiiBase','autoload'));
        spl_autoload_register($callback);
        spl_autoload_register(array('YiiBase','autoload'));
    }
}

它真的只使用spl_autoload_register和/或spl_autoload_unregister(是的,你也可以取消注册自动加载功能!),在Yii的自动加载器之前或之后放置新的自动加载器,因为spl_autoload_register始终在链的末尾注册新的自动加载器。

答案 1 :(得分:0)

我认为Yii会在你引用它时试图自动加载一个类。 Yii只是使用PHP的__autoload()函数。这是一种神奇的方法,如__get()__set()

例如,当您编写$foo = new Foo();而类Foo尚未加载时,您将收到错误消息。

但是,如果您之前定义了__autoload($classname)函数,则可以防止这种情况发生。这样,PHP将首先尝试运行__autoload($classname)函数,而不是抛出错误。在该函数中,您可以执行以下操作:包括变量$classname等等。

这里有更多信息:http://www.php.net/manual/en/function.autoload.php