【问题标题】:Difference between PSR-4 and classmap autoloading?PSR-4 和类图自动加载的区别?
【发布时间】:2016-12-05 18:51:05
【问题描述】:

关于 Laravel,我有一个关于 Composer 自动加载的问题,即“psr-4”和“classmap”自动加载的区别。

我知道的 1 个区别是 PSR-4 不需要为每次更改或添加新文件重复 dumpautoload 而类映射需要 dumpautoload 对于包含类的现有文件的每次更改或在指定目录中添加新文件。

【问题讨论】:

    标签: composer-php autoload psr-4


    【解决方案1】:

    PSR-4 标准 要求您采用基于命名空间的严格文件系统结构。假设您在 src 目录中有一个带有 App 命名空间的应用程序,那么所有子命名空间都将镜像子目录,并且类名将与没有 .php 扩展名的文件名相同。

    {
        "autoload": {
            "psr-4": { "App\\": "src/" }
        }
    }
    
    src/
        Foo/
            Bar.php <---- App\Foo\Bar class
        Baz.php <---- App\Baz class
    

    然后自动加载器“知道”在哪里寻找某个完全限定名称的类,因此不需要 dump-autoload 命令来嗅探文件的类。

    然后使用composer dump-autoload --optimize-autoloader 标志或-o 解决性能问题,这将生成类映射,类似于类映射自动加载的方式。


    另一方面,classmap autoloading几乎不需要你有任何特定的文件或目录结构,它会递归遍历指定目录和文件中的.php.inc文件,并嗅探其中的课程。

    {
        "autoload": {
            "classmap": ["src/", "lib/", "Something.php"]
        }
    }
    

    然后将这些类添加到用于自动加载的列表(缓存在供应商/作曲家目录中的 PHP 文件中)。

    然后必须通过运行composer dump-autoload 命令将任何新类添加到该列表中。

    【讨论】:

    • 没有类的普通 php 文件怎么样?例如只是一个带有一堆全局函数的php文件,如何添加?
    • @Toskan 为此,请使用files。例如,"autoload": { "files": [ "path/to/file1.php", "another/file.php", "etc.php" ] }.
    • 可以一起加载类和文件,只需使用自动加载,因为我已经尝试过但失败了。两者分开很好,但在一起没有骰子。
    • 当然。只需将 classmap/psr/files 并排使用。但是,自动加载/转储将在重复的类 FQN 上失败。如果您有具体问题,也许可以创建一个单独的问题。
    猜你喜欢
    • 2015-01-08
    • 2014-07-25
    • 2020-01-01
    • 2015-07-31
    • 2019-02-11
    • 2023-01-31
    • 2018-06-01
    • 2014-10-19
    • 2014-09-12
    相关资源
    最近更新 更多