6

我真的没有得到 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 类中运行自动加载函数(这是必需的)?

4

3 回答 3

16

spl_autoloader_register注册一个回调函数/方法,当您的代码尝试使用未知类时将调用该回调函数/方法。

回调函数可以用多种方式描述:

  • 一个简单的函数名:'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

于 2009-12-14T05:34:09.817 回答
1

你的整个陈述是正确的。

spl_autoload_register允许您注册多个自动加载功能。如果您尝试创建或使用尚未加载到 PHP 环境中的类的对象,PHP 将运行所有自动加载函数来查找该类。

您给出的 Doctrine 示例是使用所谓的回调在类中注册方法。回调只是一个包含类名(对于静态方法)或该类的实例(对于非静态方法)和方法名的数组。

于 2009-12-14T05:34:23.357 回答
0

说什么都是对的。当实例化未知类时调用它。然后,您有机会包含/需要必要的文件。

当函数驻留在类中时,您必须传入一个数组。在这种情况下,它是一个静态函数,因为它们传入 Doctrine 类而不是 Doctrine 类的实例。

于 2009-12-14T05:33:40.533 回答