为了账号安全,请及时绑定邮箱和手机立即绑定

防止使用 spl_autoload_register 加载不必要的类文件

防止使用 spl_autoload_register 加载不必要的类文件

PHP
德玛西亚99 2022-01-14 14:59:30
我在一个目录中有相当多的类文件_classes,我想拆分它们以防止它们都被不必要地加载。我希望它工作的方式是让目录中的所有类文件_classes/xs通过spl_autoload_register(). _classes/static然后,需要手动加载目录中的任何类文件。我已经创建了新目录并将所有文件移动到它们的相关文件夹中,但是当我使用 时spl_autoload_register(),它也会尝试包含来自的文件,/static即使我已经指向xs.代码init.php:spl_autoload_register(function($class){    require_once "_classes/xs/" . $class . ".php";});example.php:require_once "init.php";require_once "_classes/static/Class.php";错误警告:require_once(_classes/xs/Class.php):打开流失败:init.php 中没有这样的文件或目录所以所有文件xs都正确加载,但它也试图从中检索文件static(它不应该是)。感谢所有帮助,欢呼。
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

我们通常不将require_once()用于自动加载器,因为该文件可能根本不存在。


在您的情况下,只需更改为include_once()即可修复它:


初始化文件


spl_autoload_register(function($class){

    if (file_exists("_classes/xs/" . $class . ".php")) {

        include_once "_classes/xs/" . $class . ".php";

    }

});

边注:


我最初使用@符号来抑制错误而不是file_exists检查,因为我认为它会更高效。但令我惊讶的是,file_exists调用版本实际上运行起来要快得多。


<?php


$scale = 1000000;


function benchmark(callable $fn, $scale = 100) {

        $start = microtime(1);

        for ($i=0; $i<$scale; $i++) {

                $fn();

        }

        return microtime(1) - $start;

}


$time = benchmark(function () {

        $file = './no-such-file.php';

        if (file_exists($file)) {

                include_once $file;

        }

}, $scale);

printf("file_exists:   %0.6fs\n", $time);


$time = benchmark(function () {

        $file = './no-such-file.php';

        @include_once $file;

}, $scale);

printf("@include_once: %0.6fs\n", $time);

结果(在 PHP 7.2 上):


file_exists:   1.067368s

@include_once: 8.830794s


查看完整回答
反对 回复 2022-01-14
  • 1 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号