我并没有真正得到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类中运行autoload函数(这是必需的)?
发布于 2009-12-14 13:34:10
spl_autoloader_register注册了一个回调函数/方法,当你的代码试图使用一个未知的类时,它将被调用。
callback函数可以用几种方式描述:
类的静态方法简单的函数名:'my_function'
array('MyClass', 'myMethod')
array($myObject, 'myMethod')对于Doctrine,它似乎是第二种解决方案:如果使用了PHP不知道的类,自动加载器将调用Doctrine::autoload,并将类名作为参数传递给它。
,这样我也可以注册许多自动加载功能?
是的,您可以使用spl_autoload_register:
如果必须有多个自动加载函数,则
spl_autoload_register()允许这样做。它有效地创建了一个自动加载函数队列,并按照定义的顺序遍历每个函数。
但是我们通常不会为我们拥有的每个类定义一个自动加载函数/方法;我想这将是非常低效的。
相反,我们使用由自动加载函数接收的class-name来决定应该包含哪个文件。
例如,自动加载函数可能如下所示:
function my_autoloader($className)
{
require LIBRARY_PATH . '/' . $className . '.php';
}诀窍是,如果您的文件是以它们所包含的类命名的,那么它会立即变得容易得多;-)
这就是为什么类通常使用PEAR约定命名:My_Class_Name映射到文件My/Class/Name.php
发布于 2009-12-14 13:34:23
你的整个陈述都是正确的。
spl_autoload_register允许您注册多个自动加载函数。如果您试图创建或使用尚未加载到PHP环境中的类的对象,PHP将运行所有的autoload函数来查找该类。
您给出的Doctrine示例是使用所谓的callback在类中注册方法。回调只是一个包含类名(对于静态方法)或该类的实例(对于非静态方法)和方法名的数组。
发布于 2009-12-14 13:33:41
所说的是正确的。当一个未知的类被实例化时,它被调用。然后,您将有机会包含/需要必要的文件。
当函数驻留在类中时,您必须传入一个数组。在本例中,它是一个静态函数,因为它们传入的是Doctrine类,而不是Doctrine类的实例。
https://stackoverflow.com/questions/1899073
复制相似问题