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

时间:2009-07-19 15:13:40

标签: 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

现在使用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

那么,我应该将我的类/接口命名为什么?

7 个答案:

答案 0 :(得分:18)

当前编码指南“PSR-2”基本上建议您将界面放在一个目录中并组合名称。

例如:

File \Vendor\Foo\Interface.php ===> \Vendor\FooInterface.php.

和使用例如:

use \Vendor\Foo\Interface; ===> use\Vendor\FooInterface;

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

答案 1 :(得分:9)

关于这个问题(摘要和界面),您可以查看Matthew Weier O'Phinney博客上的帖子“Migrating OOP Libraries and Frameworks to PHP 5.3” - 它是关于Zend Framework的,以及它们如何在2.0中解决这个问题

他们注意到的一件事是:

  

在其他OOP语言中,例如   Python,C#,接口用表示   用大写字母为接口添加前缀   '一世';在上面的例子中,我们会   然后有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

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

答案 2 :(得分:8)

SubpackageAbstract, SubpackageInterface

答案 3 :(得分:7)

我个人建议避免使用匈牙利表示法,并考虑遵循接口名称的Java标准;也就是说,它们的描述与任何其他类一样。有关匈牙利符号的详细说明,请参阅this SO question

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

答案 4 :(得分:2)

您也可以这样做:

的src /象棋/ Piece.php

<?php

namespace \Chess;

abstract class Piece implements \Chess\PieceInterface {}

的src /象棋/ PieceInterface.php:

<?php

namespace \Chess;

interface PieceInterface {}

的src /象棋/件/ Pawn.php:

<?php

namespace \Chess\Piece;

class Pawn extends \Chess\Piece {}

以下是我在composer.json

中设置自动加载的方法
{
    "autoload": {
        "psr-0": {
            "": "src/"
        }
    }
}

答案 5 :(得分:1)

老实说,我相信匈牙利语符号是用C#引入的,因为Java中没有“extends”和“implements”关键字。因此区分惯例变成了称之为IView。在Java中,接口将单独称为View,实现将被称为DefaultViewImpl,SmartyViewImpl或类似的东西。由于PHP 已经扩展并实现了关键字,因此使用Java约定是有意义的。 我听说过这样的论点,即匈牙利语符号确实可以通过查看类名来使API元素可识别。在那种情况下,我会称之为IView或AbstractView。

答案 6 :(得分:-2)

在我看来,解决此问题的最佳方法是简单地将Class附加到您的类名。

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

namespace Framework\Package\Subpackage;
interface InterfaceClass {}
Framework/Package/Subpackage/InterfaceClass.php

请注意,这仍然不完美(但是,效果很好),但我保持代码与原始想法类似;)