提问者:小点点

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


我的应用程序中有两个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类与VendorYVendorX之间存在明显的命名空间冲突。

我已经去过的路线,但失败了:

>

  • 在composer.json中为任一包修改PSR-4自动加载规则,以创建新的命名空间。(我感觉到我的框架Drupal 7不尊重作曲家自动加载规则,只是默认为php 7命名空间),所以我暂时放弃了它。
  • 尝试使用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类?


  • 共1个答案

    匿名用户

    要解决此问题,请在使用命名空间时使用别名。像这样使用作为关键字

    use VendorX\MailPackageA as newPackageName; 
    

    如果你需要从这个命名空间调用类,你会得到这样的结果

    $packageName = new newPackageName\Mail();