【问题标题】:How to check if Autoload loads only used classes?如何检查 Autoload 是否仅加载使用的类?
【发布时间】:2019-01-27 23:01:49
【问题描述】:

使用 spl_autoload_register 在我的代码上自动加载类。示例:

<?php    
spl_autoload_register(function ($class_name) { 
    include 'my_class1.php';
    include 'my_class2.php';
    //...
    include 'my_classN.php';
});

$obj = new MyClass1();
?>

如果我在代码中只使用了MyClass1 类,自动加载会加载所有文件还是只加载my_class1.php? 提前致谢。

编辑:不要使用上面的代码。现在我使用 @Alex Howansky's 代码和 PSR-4 自动加载 specifications

注意:如果类位于相对于 basedir (see examples) 的子目录中,则自动加载需要使用命名空间。

【问题讨论】:

  • 有了这段代码,当你第一次引用任何类时,它会加载每个类。在自动加载器中,您通常只想加载 $class_name 引用的类。
  • 语法正确,可以使用。但是,它效率低下,并且错过了使用自动加载器的意义。
  • 感谢回复,这种情况下应该如何只为使用过的类加载文件?

标签: php class namespaces autoload spl-autoload-register


【解决方案1】:

作为补充,您可以使用 PHP 函数 get_declared_classes(),它将列出当前脚本中所有已定义的类。

【讨论】:

    【解决方案2】:

    使用此代码,当您第一次引用任何类时,它将加载每个类。这会起作用,但几乎可以肯定不是你想要的。在自动加载器中,您通常只想加载包含$class_name 引用的一个类的一个源文件。像这样的:

    spl_autoload_register(function ($class_name) {
        $filename = '/path/to/classes/' . $class_name . '.php';
        require_once $filename;
    });
    

    如果您的源文件名与您的类名不匹配,或者您无法根据类名确定源文件名,这显然会变得非常困难。这就是您应该使用PSR-4 命名约定的原因。

    【讨论】:

    • 谢谢你的例子,当文件名与类名匹配但类位于不同路径时,我应该在每个类文件中使用命名空间吗?
    • 例如:lib1/MyClass1.php 和 lib2/MyClass2.php
    • 链接页面解释了这一点。
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2017-07-24
    • 2014-09-26
    • 2016-07-18
    • 2015-07-13
    • 2022-11-10
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多