Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在netbeanstodo示例php应用程序中,spl_autoload_register是如何工作的?_Php_Class_Netbeans_Spl Autoload Register - Fatal编程技术网

在netbeanstodo示例php应用程序中,spl_autoload_register是如何工作的?

在netbeanstodo示例php应用程序中,spl_autoload_register是如何工作的?,php,class,netbeans,spl-autoload-register,Php,Class,Netbeans,Spl Autoload Register,我正在看Netbeans中Todo应用程序的示例代码。有人能在这里向我解释一下spl_自动加载_寄存器功能的用法吗: 这是自动加载功能 public function loadClass($name) { $classes = array( 'Config' => '../config/Config.php', 'Error' => '../validation/Error.php', 'Flas

我正在看Netbeans中Todo应用程序的示例代码。有人能在这里向我解释一下spl_自动加载_寄存器功能的用法吗:

这是自动加载功能

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没有定义或作为参数传递,它如何加载$classes数组中的所有类?

一般来说,当给定的功能允许您传递回调函数以便稍后调用时,该功能已经设置了函数签名(参数和返回类型)。您可以将其视为一个API调用:读取文档并提供预期的数据。句号

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

void spl\u autoload(字符串$class\u name[,字符串$file\u extensions=spl\u autoload\u extensions())

换言之:

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

这是一个预定义的签名:您不需要指定何时注册回调函数,因为无法更改它。

未定义或使用?它是
loadClass()
参数,使用了三次,不是吗?:-?在这里调用函数时没有参数:spl_autoload_register(数组($this,'loadClass'));