spl_autoload_register如何在Netbeans Todo示例php应用程序中工作


How does spl_autoload_register work in Netbeans Todo sample php App?

我正在看Netbeans中的Todo应用程序的示例代码。谁能解释一下spl_autoload_register函数的用法:

这是自动加载功能

public function loadClass($name) {
        $classes = array(
            'Config' => '../config/Config.php',
            'Error' => '../validation/Error.php',
            'Flash' => '../flash/Flash.php',
            'NotFoundException' => '../exception/NotFoundException.php',
            'TodoDao' => '../dao/TodoDao.php',
            'TodoMapper' => '../mapping/TodoMapper.php',
            'Todo' => '../model/Todo.php',
            'TodoSearchCriteria' => '../dao/TodoSearchCriteria.php',
            'TodoValidator' => '../validation/TodoValidator.php',
            'Utils' => '../util/Utils.php',
        );
        if (!array_key_exists($name, $classes)) {
            die('Class "' . $name . '" not found.');
        }
        require_once $classes[$name];
    }

这里的init函数声明loadClass以便装入类。

public function init() {
        error_reporting(E_ALL | E_STRICT);
        mb_internal_encoding('UTF-8');
        set_exception_handler(array($this, 'handleException'));
        spl_autoload_register(array($this, 'loadClass'));
        // session
        session_start();
    }

这里调用init, spl_autoload_register调用loadClass。

$index = new Index();
$index->init();

我的问题是它如何加载在$类数组中的所有类,因为$name没有定义或作为参数传递?

作为一般规则,当给定的功能块允许您传递稍后调用的回调函数时,函数签名(参数和返回类型)已经由该功能设置。您可以将其视为API调用:您阅读文档并提供预期的数据。时期。

在这种情况下,SPL自动加载器期望如下:

void spl_autoload ( string $class_name [, string $file_extensions = spl_autoload_extensions() ] )

换句话说:

  • 你的函数接收类名作为强制的第一个参数
  • 它接收一个文件扩展名作为第二个参数,但它是可选的捕获它
  • 不返回任何值

这是一个预定义的签名:你不需要指定什么时候注册回调函数,因为它是不可能改变的。