自动加载包,其中包含与导入类同名的Class

时间:2017-10-06 11:53:58

标签: php composer-php autoload

我有一个包含PHP文件的项目,该文件定义了一个名为Response的类,我通过composer自动加载Guzzle(也定义了它自己的Response类)

问题是我是否存在PHP可能会混淆应该使用哪个Response类的风险?如果我单独使用Response我不会冒险以某种方式获取Guzzle类,除非我做了use语句吗?

我认为除非我做use陈述,否则我没关系,但我只想确定。

2 个答案:

答案 0 :(得分:1)

您不会有任何冲突风险,这就是PHP Namespaces存在的原因!
虽然两个类的短名称是相同的,但他们的 FQCN (完全合格的班级名称)却不同,所以不会有混淆的可能性。

Guzzle的Response课程是:

\Guzzle\Http\Message\Response

你的课程会是这样的:

\MyApp\Response 

(或者只是\Response如果你没有为它设置命名空间,这是一个非常糟糕的做法!)

只要您为其中一个设置了别名,您就可以在课程中use使用其中任何一个,甚至两者:

use \MyApp\Response;
use \Guzzle\Http\Message\Response as GuzzleResponse;

// ...

$myResponse = new Response();
$guzzleResponse = new GuzzleResponse();

答案 1 :(得分:0)

只要类具有单独的命名空间。

Composer(及其autolaoder)将使用classname解析命名空间。 因此,如果您使用自己的类(“Class1”)和具有相同类名(“Classname”)且具有不同名称空间的外部类(“Class2”),例如

namespace \Me\MyPackage\Classname

namespace \Guzzle\Classname

你会没事的。如果您想创建其中一个类的实例,只需键入完整的限定名称空间,例如

$var1 = new \Me\MyPackage\Classname();