1 回答
TA贡献2012条经验 获得超12个赞
如果同一个 composer 项目中的多个包需要同一个包,依赖将被解决并且包将只包含一次,并且文件在 keyfiles中composer.json:
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
无论如何都不会被多次包含在内。这不是真正的“自动加载”,因为在 PHP 中实际上没有自动加载“功能”,只是这些文件将在每个需要主脚本的请求中“包含” autoload.php。
由于您提到了 Wordpress,在那个世界中事情会变得更加棘手,因为多个插件将是单独的 Composer 项目,每个插件都有自己声明的依赖项,这些依赖项将被并行加载。
如果多个插件声明了自己的composer.json文件,并且它们使用相同的包,它们将尝试加载相同文件的多个副本,并再次定义相同的类和函数。这可能会导致与类名和函数名的冲突。
即使自动加载器使用类似的东西include_once(它没有),它也不会工作。因为每个插件都有自己的包副本,并且会包含不同的文件。
您可以采取一些基本的预防措施,例如将您的函数声明包装在if (!function_exists('my_function') { }. 就像是:
<?php
if (function_exists('foo')) {
return;
}
function foo() {
echo "foo";
}
以避免在尝试定义已定义的函数时出现致命错误)。
这将避免尝试两次定义相同的函数,但如果多个插件依赖于同一包的不同且不兼容的版本,您也可能会遇到麻烦。
Wordpress 和 Composer 根本不是很好的伙伴,因为 Wordpess 很难适应现代方式来管理更广泛的 PHP 生态系统中的依赖关系。
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报