我应该更喜欢在 spl_autoload_register() 回调中使用 require 而不是 require_once

Should I prefer require instead of require_once inside spl_autoload_register() callback

PHP docs 的示例中,加载程序在其中使用 include

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

但至少有几个 (, two) 自动加载相关的 SO 问题出现 require_once()。 事实上,我自己的代码也已经使用了require_once()

所以,我的问题是:如何 include/require 自动加载器回调中的源文件真的重要吗

我想我理解 includerequire 之间的区别,关于 …_once 部分的问题 :)

当在该回调中使用 require_once() 时,PHP 是否会针对已经需要的文件列表进行额外检查? 如果我们将使用require(),是否存在双重要求某些文件的风险? require() 会比 require_once() 快吗?

function my_autoloader($class) {
    require_once('classes/' . $class . '.class.php');
}

spl_autoload_register('my_autoloader');

VS

function my_autoloader($class) {
    require('classes/' . $class . '.class.php');
}

spl_autoload_register('my_autoloader');

我创建了一个 primitive benchmark

我无法看出这两种方法之间的显着差异(requirerequire_once)。也许 "benchmark" 本身有问题,请随时发送 PR 来修复它:)

当其他进程在测试时使用磁盘时,执行时间发生了最明显的变化 运行。

两种方法在 7200rpm HDD 上显示 300 类 ~0.062。

> php -v
PHP 7.2.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies