消除两个供应商使用的PHP命名空间的歧义

时间:2018-02-01 16:22:19

标签: php namespaces drupal-7 composer-php psr-4

我的应用中有两个编写器包,它们在第三方模块中创建命名空间冲突。我试图确定在第三方模块中消除歧义的破坏性最小的方法,以便我不必分叉包。

Vendor 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)的包,但是来自不同的供应商,&#34; VendorY&#34 ;。与VendorX / MailPackageA一样,它位于像

这样的目录结构中

path/to/vendor/VendorY/MailPackageA

<?php

namespace MailPackageA;

class Mail {
    ...
}

添加此内容后,我在$mail_object = new MailPackageA\Mail();的MailingModule / mail.inc中收到错误,因为来自MailPackageA\MailVendorY的{​​{1}}类之间明显存在名称空间冲突。

路线我已经失败但失败了:

  • 修改composer.json中的PSR-4自动加载规则,以获取任一包以创建新的命名空间。 (我感觉我的框架 - Drupal 7 - 不尊重作曲家自动加载规则,只是默认为库存php 7命名空间),所以我暂时放弃了这一点。
  • 尝试使用VendorX向MailingModule / mail.inc文件添加供应商前缀别名。

    use

    我怀疑我的应用程序不了解供应商目录。不知道如何强迫它。

确保MailingModule仅使用Vendor X中的MailPackageA \ Mail类,破坏性最小的方式(即最小分叉/修补)是什么?

1 个答案:

答案 0 :(得分:0)

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

use VendorX\MailPackageA as newPackageName; 

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

$packageName = new newPackageName\Mail();