作曲家在文件夹中自动加载多个文件

2022-08-30 16:33:08

我在最新的项目中使用作曲家,并像这样映射我的函数

"require": {
    ...
},
"require-dev": {
    ...
},
"autoload": {
    "psr-4": {
        ...
    },
    "files": [
        "src/function/test-function.php"
    ]
}

我想一个文件夹函数中会有很多文件,例如:real-function-1.php,real-function-2.php等。那么,作曲家可以调用文件夹函数中的所有文件吗?我懒用

"files": [
     "src/function/real-function-1.php",
     "src/function/real-function-2.php",
     ..,
     "src/function/real-function-100.php",
]

有没有像我一样懒惰的人...


答案 1

如果你不能为函数命名命名空间(因为它会破坏一堆代码,或者因为你不能使用 PSR-4),并且你不想创建保存函数的静态类(然后可以自动加载),你可以创建自己的全局包含文件,然后告诉 composer 包含它。

composer.json

{
    "autoload": {
        "files": [
            "src/function/include.php"
        ]
    }
}

包括.php

$files = glob(__DIR__ . '/real-function-*.php');
if ($files === false) {
    throw new RuntimeException("Failed to glob for function files");
}
foreach ($files as $file) {
    require_once $file;
}
unset($file);
unset($files);

这是不理想的,因为它将为每个请求加载每个文件,无论其中的函数是否被使用,但它将起作用。

注意:请确保将包含文件保留在 /real 函数或类似目录之外。或者它还将包括自身,结果是递归函数,并最终引发内存异常。


答案 2

实际上,现在有更好的方法可以在没有任何自定义代码的情况下执行此操作。如果您正在使用类,则可以使用 Composer 的类映射功能。如果您正在处理包含函数的单个文件,则必须使用数组。files[]

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

推荐