我正在看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() ] )
换句话说:
- 你的函数接收类名作为强制的第一个参数
- 它接收一个文件扩展名作为第二个参数,但它是可选的捕获它
- 不返回任何值
这是一个预定义的签名:你不需要指定什么时候注册回调函数,因为它是不可能改变的。