自动加载包含 Class 与导入 class 同名的包

Autoloading package that contains Class of same name as imported class

我有一个项目,其中包含一个 PHP 文件,该文件定义了一个名为 Response 的 class 并且我正在通过 composer 自动加载 Guzzle(它还定义了它自己的 Response class)

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

我认为这很好,除非我执行 use 声明,但我只是想确定一下。

只要 classes 有单独的命名空间。

Composer(及其自动加载器)将使用 classname 解析命名空间。 因此,如果您使用自己的 class ("Class1") 和具有相同 classname ("Classname") 的外国 class ("Class2")不同的命名空间,例如

namespace \Me\MyPackage\Classname

namespace \Guzzle\Classname

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

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

您没有任何冲突风险,这就是 PHP Namespaces 存在的原因!
虽然两个 class 的 short name 相同,但它们的 FQCN (Fully Qualified Class Name) 不同, 所以不会混淆。

Guzzle 的 Response class 是:

\Guzzle\Http\Message\Response

你的 class 会是这样的:

\MyApp\Response 

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

您可以 use 在您的 class 中使用它们中的任何一个,甚至可以同时使用两者,只要您为其中之一设置别名即可:

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

// ...

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