我在__autoload
课程中寻找YiiBase
魔术方法,但它不是。在官方文档中说public static function autoload($className)
是
类自动加载器。提供此方法以在一个中调用 __autoload()魔法。
我很困惑。什么类yii
框架包含__autoload
魔法?是否可以通过组件类自动加载获得示例?
答案 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
等等。