为了账号安全,请及时绑定邮箱和手机立即绑定

Composer autoload - 文件选项和 packagist

Composer autoload - 文件选项和 packagist

PHP
开满天机 2023-03-04 18:09:00
我已经开发了几个作曲家模块,并已成功发布给 packagist。所有这些都是完全基于类的,我知道自动加载过程是如何工作的——如果多个项目使用我的 packagist 模块,它们只会被包含一次。它对文件也一样吗?我想为“缺失的”WordPress 功能开发一个 packagist 模块——即我在所有项目中经常使用的功能。如果多个项目包含该 packagist 模块,我会收到有关同一名称空间中同一函数的多个定义的错误吗?澄清。我正在创建一个作曲家模块 sgi/wp-utils。它不会有课。它只会包含文件。像这样{    "autoload": {        "files": [            "src/Assets/functions.php",            "src/Posts/functions.php"         ]    }}它将用于定义我计划在许多项目(插件、主题)中使用的实用程序功能。如果多个插件/主题使用同一个包,作曲家每次 WP 安装只加载一次文件,还是我需要用调用包装函数function_exists()?
查看完整描述

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 生态系统中的依赖关系。


查看完整回答
反对 回复 2023-03-04
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信