在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并使用命名空间我不能再使用我的约定,因为interface
和abstract
是保留关键字。
namespace Framework\Package\Subpackage;
abstract class Abstract {}
Framework/Package/Subpackage/Abstract.php
namespace Framework\Package\Subpackage;
interface Interface {}
Framework/Package/Subpackage/Interface.php
那么,我应该将我的类/接口命名为什么?
答案 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
请注意,这仍然不完美(但是,效果很好),但我保持代码与原始想法类似;)