興味深いテーマです。私はあなたに設計指向の答えを与えるつもりです。
私の意見では、良いOOPアーキテクチャで静的なクラス/関数を使うべきではありません。
staticを使用する場合、これはクラスのインスタンスを持たない関数を呼び出すことです。主な理由は、多くの場合、何度もインスタンス化すべきではないサービスクラスを表現することです。
私はあなたにそれを達成するために、(worsteから最高へ)3つのソリューションを提供します:
静的(唯一の静的な機能を備えた)静的クラスのような、多くのOOP機能を使用してからあなたを防ぐ
継承、インタフェース実装。あなたが本当に静的な関数であると考えるなら、それはそのクラスの名前で名前空間をつけられた関数です。あなたはすでにPHPに名前空間を持っています、なぜ別の層を追加するのですか?
もう1つの大きな欠点は、静的クラスとそのクラスを使用するクラスに明確な依存関係を定義できないことです。これは、アプリケーションの保守性とスケーラビリティに悪いことです。
<?php
class Singleton {
// Unique instance.
private static $instance = null;
// Private constructor prevent you from instancing the class with "new".
private function __construct() {
}
// Method to get the unique instance.
public static function getInstance() {
// Create the instance if it does not exist.
if (!isset(self::$instance)) {
self::$instance = new Singleton();
}
// Return the unique instance.
return self::$instance;
}
}
それはあなたが継承、インターフェースを使用することができますし、あなたの方法があることになるので、より良い方法がある:
シングルトン
シングルトンはインスタンスを1つだけ持つようにクラスを強制する方法ですインスタンス化されたオブジェクトを呼び出します。これは、契約を定義し、それを使用するクラスにlow couplingを使用できることを意味します。しかし、入力のプロパティが異なる3つのクラスのインスタンスを持つことができない場合は、特にsingleton as an anti patternを考慮する人がいます。
サービス
サービスは、標準のクラスのインスタンスです。それはあなたのコードを合理化する方法です。この種のアーキテクチャは、SOA(サービス指向アーキテクチャ)と呼ばれています。
店舗内の商品を消費者に販売する方法を追加したい場合は、クラスProduct
,Store
、Consumer
があります。どこでこのメソッドをインスタンス化する必要がありますか?私は、あなたが明日この3つのクラスのいずれかでもっと論理的だと思うなら、明日何か他のものになる可能性があることを保証することができます。これは重複していて、探しているコードがどこにあるのかを見つけるのが難しいことにつながります。代わりに、SaleHandler
のようなサービスクラスを使用して、データクラスを操作する方法を知ることができます。
可能性の高いものを使用するには、フレームワークを使用して相互に注入することをお勧めします(dependency injection)。 PHPコミュニティでは、たとえばSymfony2にこれを実装する良い例があります。
要約すると:あなたはフレームワークを持っていない場合
ネイティブでシンプルな機能を使用する代わりに、より複雑で冗長でエラーが発生しやすいシングルトンを使用する必要があります。同意しません。 – magallanes