web-dev-qa-db-ja.com

PHP 5.3(名前空間を使用)でのインターフェース/抽象クラスの命名

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

では、クラス/インターフェイスにどのような名前を付ける必要がありますか?

29
Philippe Gerber

現在のコーディングガイド「PSR-2」では、基本的に、インターフェイスを1つのディレクトリにドロップして、名前を組み合わせることが推奨されています。

例えば:

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

18
Mike Graf

この質問(抽象とインターフェース)については、投稿 " Migrating OOP Libraries and Frameworks to PHP 5. = "Matthew WeierO'Phinneyのブログ-ZendFrameworkと、2.0でその問題を解決する方法について説明しています。

彼らが注意することの1つは:

他の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

あれについてどう思う ? (私はこの方法をテストしていませんが、悪い考えのようには見えませんか?)

9
Pascal MARTIN

サブパッケージの要約、サブパッケージのインターフェース

8
erenon

個人的には、ハンガリアン記法の使用を避け、インターフェース名のJava標準に従うことを検討してください。つまり、他のクラスと同じようにわかりやすい名前が付けられています。 this SO質問 ハンガリアン記法の詳細についての議論。

機能や動作を示す一般的で説明的な名前を使用する良い例は、「Countable」、「Iterator」、「ArrayObject」などのPHP独自のSPLにあります。

7
jason

次のようなこともできます。

src/Chess/Piece.php

<?php

namespace \Chess;

abstract class Piece implements \Chess\PieceInterface {}

src/Chess/PieceInterface.php:

<?php

namespace \Chess;

interface PieceInterface {}

src/Chess/Piece/Pawn.php:

<?php

namespace \Chess\Piece;

class Pawn extends \Chess\Piece {}

これが私が自動読み込みを設定する方法です composer.json

{
    "autoload": {
        "psr-0": {
            "": "src/"
        }
    }
}
2
Stoutie

正直なところ、Javaのように「extends」や「implements」というキーワードがないため、ハンガリアン記法はC#で導入されたと思います。したがって、規則を区別するために、それをIViewと呼ぶようになりました。 Javaでは、インターフェースはViewのみと呼ばれ、実装はDefaultViewImpl、SmartyViewImplなどと呼ばれます。 PHP doesはキーワードを拡張して実装しているので、Java規則を使用するのは理にかなっています。私は、次のような議論を聞いたことがあります。ハンガリアン記法は、クラス名を見るだけでAPI要素を識別できるようにするのに役立ちます。その場合、私はそれをIViewまたはAbstractViewと呼びます。

1
blockhead