web-dev-qa-db-ja.com

定数インターフェイスのアンチパターン-PHP

私はこれに遭遇しました Wikiepediaの記事 定数を定義するためにインターフェースを使用することは良いことではないと述べています。

最終クラスで定数を定義し、静的インポートを使用することを提案するソリューション。これはJavaで機能します。私はPHP "import"のない世界から来ました。それで、PHPの受け入れられる解決策は何ですか?

7
Srisa

クラス定数 を使用するだけです。

class ConstClass
{
    const SOME_CONSTANT = 10;
}

echo ConstClass::SOME_CONSTANT;

PHP5以降、 最終キーワード もサポートされています。

3
Steven Jeuris

あなたは言う記事を参照しています

Javaプログラミング言語では、定数インターフェースパターンは、定数を定義するためだけにインターフェースを使用し、それらの定数への便利な構文アクセスを実現するためにクラスにそのインターフェースを実装させることを記述します。ただし、- 定数は非常に多くの場合、単なる実装の詳細であり、クラスによって実装されたインターフェースはそのエクスポートされたAPIの一部であるため、これは、実装の詳細をAPIに入れることに相当します。これは不適切と見なされます。一般に、収集システム定数を動作に依存しないクラスに入れると、凝集度が低いことを示すことが多いため、オブジェクト指向のデザインが貧弱になる可能性がありますこれらの理由により、定数インターフェースの実装はアンチパターンと見なされます。

私はJavaから来て、現在PHP=をやっています...私の観点からは、内部システムの性質を持つインターフェース定数を使用している限り、問題ありません...外部APIの一部としてインターフェース定数を公開し始めたら、インターフェースではなくクラスを使用してそれを行うべきです。

考慮すべきもう1つのことは、シリアル化と展開パッケージです。エラーのない直列化復元を有効にするために展開パッケージの一部として定数が必要な場合は、実装の詳細をクラスに追加できますが、インターフェイスには追加できません。

悲しいことにPHPは、名前空間を制御し、定数のスコープを制御するために、public、protected、privateしか知りません。Javaには、package-privateがあり、基本的には「同じディレクトリ内」/「Javaパッケージde。*」と表示されます。

Javaを他の言語と比較し、一般的なOODesignと言語間で参照されるant-patternsについて結論を出すとき、これを忘れないでください。間違った結論につながる可能性があります;-) ...

ウィキペディアの記事が間違っているとは言いませんが、100%正しいわけでもありません。

ちょうど私の2€セント

2
Wizard Of Tech

クラスをインポートする=)
いいえ、PHPには「インポート」機能はありませんが、クラスのソースファイルを含める必要がありますなんとなく。定数を定義するクラスを含めるだけです。

私はクラスを抽象化して クラス定数 を使用することをお勧めします。

1
Gipsy King