PHP spl_autoload

ice*_*l89 6 php spl-autoloader

我真的没有得到spl_autoload的文档

bool spl_autoload_register  ([ callback $autoload_function  ] )
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当php遇到未加载的类时,它将尝试运行已注册的函数.举个例子,

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();
Run Code Online (Sandbox Code Playgroud)

会导致要求运行吗?所以我还可以注册许多自动加载功能?

public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');
Run Code Online (Sandbox Code Playgroud)

在学说的情况下,

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
Run Code Online (Sandbox Code Playgroud)

一个数组被传递,所以我想它会尝试在Doctrine类中运行自动加载功能(这是必需的)?

Pas*_*TIN 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';
}
Run Code Online (Sandbox Code Playgroud)

诀窍在于,如果您的文件以它们包含的类命名,它立即变得更容易;-)

这就是为什么类通常使用PEAR约定命名的原因:My_Class_Name映射到文件My/Class/Name.php