【问题标题】:PHP spl_autoloadPHP spl_autoload
【发布时间】:2010-12-26 07:48:00
【问题描述】:

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

bool spl_autoload_register  ([ callback $autoload_function  ] )

据我了解,当 php 遇到尚未加载的类时,它将尝试运行注册的函数。比如,

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

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

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

【问题讨论】:

    标签: php spl-autoloader


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      你的整个陈述是正确的。

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

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

      【讨论】:

        【解决方案3】:

        说的对。当实例化未知类时调用它。然后您就有机会包含/要求必要的文件。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 2013-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          相关资源
          最近更新 更多