PHP spl_autoload

时间:2009-12-14 05:26:49

标签: php spl-autoloader

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

3 个答案:

答案 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类的实例。