我真的没有得到spl_autoload的文档
bool spl_autoload_register ([ callback $autoload_function ] )
从我的理解,它将尝试运行注册当php遇到未加载的类时。例如,
public function autoload() {
require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();
会导致需要运行吗?所以我还可以注册许多自动加载功能?
public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');
在学说的情况下,
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
传递一个数组,所以我想它会尝试在Doctrine类中运行自动加载功能(这是必需的)?
答案 0 :(得分:16)
spl_autoloader_register
注册一个回调函数/方法,当你的代码试图使用一个未知类时,它将被调用。
callback函数可用多种方式描述:
'my_function'
array('MyClass', 'myMethod')
array($myObject, 'myMethod')
对于Doctrine,它似乎是第二种解决方案:如果使用了PHP不知道的类,自动加载器将调用Doctrine::autoload
,并将类名称作为参数传递给它。
所以我也可以注册许多自动加载 功能
是的,你可以spl_autoload_register
:
如果必须有多个自动加载 函数,
spl_autoload_register()
允许这样做。它有效 创建一个自动加载功能队列, 并贯穿其中的每一个 订购它们。
但我们通常不为每个类定义一个自动加载函数/方法;我认为这样效率很低。
相反,我们使用自动加载功能接收的类名来决定应该包含哪个文件。
例如,自动加载功能可能如下所示:
function my_autoloader($className)
{
require LIBRARY_PATH . '/' . $className . '.php';
}
诀窍在于,如果您的文件以它们包含的类命名,它立即变得更容易; - )
这就是为什么通常使用PEAR约定来命名类:My_Class_Name
映射到文件My/Class/Name.php
答案 1 :(得分:1)
您的整个陈述是正确的。
spl_autoload_register
允许您注册多个自动加载功能。如果您尝试创建或使用尚未加载到PHP环境中的类的对象,PHP将运行所有自动加载函数来查找该类。
你给出的Doctrine示例是使用所谓的callback来注册类中的方法。回调只是一个包含类名(对于静态方法)或该类的实例(对于非静态方法)和方法名称的数组。
答案 2 :(得分:0)
说什么是正确的。在实例化未知类时调用它。然后,您有机会包含/要求必要的文件。
当函数驻留在类中时,您必须传入一个数组。在这种情况下,它是一个静态函数,因为它们传入Doctrine类而不是Doctrine类的实例。