Composer/PSR - 如何自动加载功能?

mpe*_*pen 42 autoload psr-0 composer-php

如何自动加载辅助函数(在任何类之外)?我可以在composer.json某种应该先加载的引导程序文件中指定吗?

mpe*_*pen 67

您可以通过编辑文件来自动加载特定文件,composer.json如下所示:

"autoload": {
    "files": ["src/helpers.php"]
}
Run Code Online (Sandbox Code Playgroud)

(谢谢Kint)

  • 请注意,在调用自动​​加载文件时将始终包含此文件 - 因此最好快速,或者使用它的每个PHP脚本都会受到影响. (6认同)
  • 对于已经设置了 PSR-4 自动加载模式并希望以与类相同的方式自动加载功能的人来说,这不是一个合适的答案。 (4认同)

Anw*_*war 11

经过一些测试,我得出的结论是,将命名空间添加到包含函数的文件,并设置 composer 自动加载此文件似乎不会在所有需要自动加载路径的文件中加载此函数。

为了综合,这将在任何地方自动加载您的函数:

作曲家.json

"autoload": {
    "files": [
        "src/greetings.php"
    ]
}
Run Code Online (Sandbox Code Playgroud)

src/greetings.php

<?php
    if( ! function_exists('greetings') ) {
        function greetings(string $firstname): string {
            return "Howdy $firstname!";
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

...

但这不会在自动加载的每个要求中加载您的功能:

作曲家.json

"autoload": {
    "files": [
        "src/greetings.php"
    ]
}
Run Code Online (Sandbox Code Playgroud)

src/greetings.php

<?php
    namespace You;

    if( ! function_exists('greetings') ) {
        function greetings(string $firstname): string {
            return "Howdy $firstname!";
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

您可以使用use function ...;以下方法调用您的函数:

示例/示例-1.php

<?php
    require( __DIR__ . '/../vendor/autoload.php' );

    use function You\greetings;

    greetings('Mark'); // "Howdy Mark!"
?>
Run Code Online (Sandbox Code Playgroud)

  • 那是因为您的条件不正确 - 您应该对 `function_exists()` 使用 FQN:`if(!function_exists('You\greetings'))`。它与自动加载无关。 (2认同)
  • +1 对于工作示例,如果您不想在每个函数调用之前指定名称空间,只需将 `use function You\greetings;` 添加到文件顶部 (2认同)