gpt4 book ai didi

php - 消除两个供应商使用的 PHP namespace 的歧义

转载 作者:行者123 更新时间:2023-12-02 04:31:15 26 4
gpt4 key购买 nike

我的应用程序中有两个 Composer 包,它们在第三方模块中造成命名空间冲突。我正在尝试确定在第三方模块中消除歧义的破坏性最小的方法,这样我就不必 fork 这些包了。

来自供应商 X 的第一个包,位于如下目录结构中

path/to/vendor/VendorX/MailPackageA:

<?php

namespace MailPackageA;

class Mail {
...
}

我现有的第三方模块,将 VendorX/MailPackageA 列为依赖项,位于类似

的结构中

moduleDirectory/MailingModule/mail.inc:

<?php

class ThirdPartyMailMod implements CoreMailSystem {

$mail_object = new MailPackageA\Mail();
. . .

}

对于另一个模块中使用的稍微不同的邮件功能,我必须添加一个使用相同 namespace 标识符 (MailPackageA) 的包,但来自不同的供应商,"供应商 Y”。和VendorX/MailPackageA一样,放在类似

的目录结构中

path/to/vendor/VendorY/MailPackageA:

<?php

namespace MailPackageA;

class Mail {
...
}

添加这个之后,我在 MailingModule/mail.inc 的 $mail_object = new MailPackageA\Mail(); 中收到错误,因为 MailPackageA\Mail 之间存在明显的命名空间冲突> 来自 VendorYVendorX 的类。

我已经下过但失败的路线:

  • 修改 composer.json 中的 PSR-4 自动加载规则,以创建新的命名空间。 (我感觉我的框架——Drupal 7——不遵守 Composer 自动加载规则,只是默认使用标准的 php 7 命名空间),所以我暂时放弃了它。
  • 尝试使用 use 将供应商前缀别名添加到 MailingModule/mail.inc 文件。

    <?php

    use VendorX\MailPackageA;

    \\ also tried the `use VendorX\MailPackageA as MailPackageA;` pattern to no effect

    class ThirdPartyMailMod implements CoreMailSystem {

    $mail_object = new MailPackageA\Mail();

    }

    我怀疑我的应用不知道供应商目录。不知道如何强制执行。

确保 MailingModule 仅使用来自供应商 X 的 MailPackageA\Mail 类的破坏性最小的方法(即最少的 fork /修补)是什么?

最佳答案

要克服此问题,请在使用 namespace 时使用 alias 。像这样使用 as 关键字

use VendorX\MailPackageA as newPackageName; 

如果你需要从这个命名空间调用类,你会像这样

$packageName = new newPackageName\Mail();

关于php - 消除两个供应商使用的 PHP namespace 的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com