PHP 命名空间 Class 命名约定

PHP Namespace Class Naming Convention

我目前关注 PSR-2 和 PSR-4。在尝试列举一些 类 时,我 运行 陷入了一个小困境。这是一个例子。

我有一个基本的 REST 客户端,\Vendor\RestClient\AbstractClient。我有这个抽象客户端的两个实现:

客户端的命名类是否多余,因为命名空间已经指定了域?我应该改为命名我的 类:

这意味着客户端代码将始终使用如下内容:

use Vendor\GoogleClient\Client;

$client = new Client();

这比以下更简洁:

use Vendor\GoogleClient\GoogleClient;

$client = new GoogleClient();

但是第一个选项允许我们仅通过更改 use 语句来轻松交换实现。

PSR4 指定 InterfacesAbstractClasses 应分别以 Interface 为后缀并以 Abstract 为前缀,但它没有说明特定领域 prefixes/suffixes .任何 opinions/suggestions?

这完全取决于您,因为 PSR 中没有对此的命名约定。但是你在做决定时要记住的是,如果你决定

  • \Vendor\GoogleClient\Client
  • \Vendor\GithubClient\Client

并且您想同时使用它们(use

use Vendor\GoogleClient\Client;
use Vendor\GithubClient\Client;

$client = new Client();

你会 运行 出错,因为 Client 不是唯一的。

当然你仍然可以像

一样一次使用它们
use Vendor\GoogleClient\Client as GoogleClient;
use Vendor\GithubClient\Client as GithubClient;

$client1 = new GoogleClient();
$client2 = new GithubClient();

或没有use喜欢

$client1 = new Vendor\GoogleClient\Client();
$client2 = new Vendor\GithubClient\Client();

但是如果你计划程序员可以通过更改

只需一行就可以轻松地在他的代码中切换客户端
use Vendor\GoogleClient\Client;
$client = new Client();

use Vendor\GithubClient\Client;
$client = new Client();

这比将所有 new GoogleClient() 语句也更改为 new GithubClient() 容易得多。

结论
你看这个决定在很大程度上取决于你自己的需要和喜好。自己决定哪一个更适合你。

请注意,还请考虑使用以下方式进行重构:

  • \Vendor\Client\Google
  • \Vendor\Client\GitHub

逻辑是:从最不具体到最具体。

话虽如此,但通常这是不可能的。