PHP 5.3中的接口/抽象类的命名(使用命名空间)

Phi*_*ber 29 php namespaces naming-conventions

在PHP 5.3之前,我曾经将接口/抽象类命名为:

abstract class Framework_Package_Subpackage_Abstract {}
Framework/Package/Subpackage/Abstract.php

interface Framework_Package_Subpackage_Interface {}
Framework/Package/Subpackage/Interface.php
Run Code Online (Sandbox Code Playgroud)

现在使用PHP 5.3并使用命名空间我不能再使用我的约定了,因为interfaceabstract是保留的关键字.

namespace Framework\Package\Subpackage;
abstract class Abstract {}
Framework/Package/Subpackage/Abstract.php

namespace Framework\Package\Subpackage;
interface Interface {}
Framework/Package/Subpackage/Interface.php
Run Code Online (Sandbox Code Playgroud)

那么,我应该如何命名我的类/接口呢?

Mik*_*raf 18

当前编码指南"PSR-2"基本上建议您将接口放在一个目录中并合并名称.

例如:

File \Vendor\Foo\Interface.php ===> \Vendor\FooInterface.php.
Run Code Online (Sandbox Code Playgroud)

和使用的例子:

use \Vendor\Foo\Interface; ===> use\Vendor\FooInterface;
Run Code Online (Sandbox Code Playgroud)

请参阅:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

  • PSR-2表明没有这样的事情.事实上,该指南明确列出了指南中遗漏的"类名前缀和后缀"是故意的."FooInterface"仅出现在一个示例中,但指南没有声明它的命名. (7认同)
  • 这确实比接受的答案要好得多.一个好的答案应该总是提供一个解释. (2认同)

Pas*_*TIN 9

关于这个问题(摘要和接口),你可以看一下Matthew Weier O'Phinney博客上的帖子"将OOP库和框架迁移到PHP 5.3 " - 它是关于Zend Framework的,以及他们如何在2.0中解决这个问题.

他们注意到的一件事是:

在其他OOP语言中,例如Python,C#,接口通过在接口前面加上大写"I"来表示; 在上面的例子中,我们将有Zend :: View :: IView.

所以,在你的例子中,你会有这样的东西,我想:

namespace Framework\Package\Subpackage;
abstract class ASubpackage {}
Framework/Package/Subpackage/ASubpackage.php

namespace Framework\Package\Subpackage;
interface ISubpackage {}
Framework/Package/Subpackage/ISubpackage.php
Run Code Online (Sandbox Code Playgroud)

你觉得怎么样? (我没有用这种方式测试,但看起来不是一个坏主意?)


ere*_*non 8

SubpackageAbstract,SubpackageInterface


jas*_*son 7

我个人建议避免使用匈牙利表示法,并考虑遵循接口名称的Java标准; 也就是说,它们的描述与任何其他类一样.请参阅此SO问题,以讨论匈牙利符号的来龙去脉.

使用指示功能或行为的通用描述性名称的一个很好的例子可以在PHP自己的SPL中找到,例如:"Countable","Iterator","ArrayObject".

  • 这是最好的恕我直言。从名字上就应该清楚,它是一个抽象的通用概念,而不是一个具体的实现。说到摘要,我确实喜欢以“抽象”作为前缀。 (2认同)