我的应用程序中有两个composer包,它们在第三方模块中创建名称空间冲突。我正试图确定在第三方模块中消除歧义的最不具破坏性的方法,这样我就不必分叉包了。
来自供应商X的第一个包,位于目录结构中,如
路径/到/供应商/VendorX/MailPackageA
:
<?php
namespace MailPackageA;
class Mail {
...
}
我现有的第三方模块,将VendorX/MailPackageA
列为依赖项,位于类似
moduleDirectory/MailingModule/mail。公司
:
<?php
class ThirdPartyMailMod implements CoreMailSystem {
$mail_object = new MailPackageA\Mail();
. . .
}
对于在另一个模块中使用的略有不同的邮件功能,我必须添加一个包,该包使用相同的命名空间
标识符(MailPackageA
),但来自不同的供应商“VendorY”。像VendorX/MailPackageA一样,它被放在目录结构中,比如
路径/到/供应商/VendorY/MailPackageA
:
<?php
namespace MailPackageA;
class Mail {
...
}
添加此项后,MailingModule/mail中出现错误。inc at$mail\u object=new-MailPackageA\mail()因为
MailPackageA\Mail
类与VendorY
和VendorX
之间存在明显的命名空间冲突。
我已经去过的路线,但失败了:
>
尝试使用use
向MailingMoules/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();
}
我怀疑我的应用程序不知道供应商目录。我不知道该怎么强制。
什么是破坏性最小的方法(即最小的分叉/修补)来确保MailingMoules只使用来自供应商X的MailPackageA\Mail类?
要解决此问题,请在使用命名空间时使用
别名
。像这样使用作为
关键字
use VendorX\MailPackageA as newPackageName;
如果你需要从这个命名空间调用类,你会得到这样的结果
$packageName = new newPackageName\Mail();