Composer autoload - 文件选项和 packagist

我已经开发了几个作曲家模块,并已成功发布给 packagist。


所有这些都是完全基于类的,我知道自动加载过程是如何工作的——如果多个项目使用我的 packagist 模块,它们只会被包含一次。


它对文件也一样吗?


我想为“缺失的”WordPress 功能开发一个 packagist 模块——即我在所有项目中经常使用的功能。


如果多个项目包含该 packagist 模块,我会收到有关同一名称空间中同一函数的多个定义的错误吗?


澄清。


我正在创建一个作曲家模块 sgi/wp-utils。它不会有课。它只会包含文件。像这样


{

    "autoload": {

        "files": [

            "src/Assets/functions.php",

            "src/Posts/functions.php"

         ]

    }

}

它将用于定义我计划在许多项目(插件、主题)中使用的实用程序功能。


如果多个插件/主题使用同一个包,作曲家每次 WP 安装只加载一次文件,还是我需要用调用包装函数function_exists()?


开满天机
浏览 93回答 1
1回答

繁花如伊

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