首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP spl_autoload

PHP spl_autoload
EN

Stack Overflow用户
提问于 2009-12-14 13:26:49
回答 3查看 4.9K关注 0票数 6

我并没有真正得到spl_autoload的文档

代码语言:javascript
复制
bool spl_autoload_register  ([ callback $autoload_function  ] )

据我所知,当php遇到一个尚未加载的类时,它会尝试运行已注册的函数。所以举个例子,

代码语言:javascript
复制
public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

是否会导致要求运行?所以我也可以注册很多自动加载函数?

代码语言:javascript
复制
public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');

在教义的情况下,

代码语言:javascript
复制
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

传递了一个数组,所以我猜它会尝试在Doctrine类中运行autoload函数(这是必需的)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-14 13:34:10

spl_autoloader_register注册了一个回调函数/方法,当你的代码试图使用一个未知的类时,它将被调用。

callback函数可以用几种方式描述:

类的静态方法简单的函数名:'my_function'

  • a类的静态方法:类的实例的array('MyClass', 'myMethod')

  • a

  • array($myObject, 'myMethod')

对于Doctrine,它似乎是第二种解决方案:如果使用了PHP不知道的类,自动加载器将调用Doctrine::autoload,并将类名作为参数传递给它。

,这样我也可以注册许多自动加载功能?

是的,您可以使用spl_autoload_register

如果必须有多个自动加载函数,则spl_autoload_register()允许这样做。它有效地创建了一个自动加载函数队列,并按照定义的顺序遍历每个函数。

但是我们通常不会为我们拥有的每个类定义一个自动加载函数/方法;我想这将是非常低效的。

相反,我们使用由自动加载函数接收的class-name来决定应该包含哪个文件。

例如,自动加载函数可能如下所示:

代码语言:javascript
复制
function my_autoloader($className)
{
    require LIBRARY_PATH . '/' . $className . '.php';
}

诀窍是,如果您的文件是以它们所包含的类命名的,那么它会立即变得容易得多;-)

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

票数 16
EN

Stack Overflow用户

发布于 2009-12-14 13:34:23

你的整个陈述都是正确的。

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

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

票数 1
EN

Stack Overflow用户

发布于 2009-12-14 13:33:41

所说的是正确的。当一个未知的类被实例化时,它被调用。然后,您将有机会包含/需要必要的文件。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1899073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档