2015-11-14 15 views
10

私は10のメソッドを含むクラスを持っています。 私はいつもそれらの方法の1つを使用する必要があります。今私は知りたい、どのアプローチが良いですか?いつ静的メソッドを使用する必要がありますか?

class cls{ 
    public function func1(){} 
    public function func2(){} 
    . 
    . 
    public function func10(){} 
} 

$obj = new cls; 
$data = $obj->func3(); // it is random, it can be anything (func1, or func9 or ...) 

OR

class cls{ 
    public static function func1(){} 
    public static function func2(){} 
    . 
    . 
    public static function func10(){} 
} 

cls::func3(); // it is random, it can be anything (func1, or func9 or ...) 

答えて

19

興味深いテーマです。私はあなたに設計指向の答えを与えるつもりです。

私の意見では、良い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,StoreConsumerがあります。どこでこのメソッドをインスタンス化する必要がありますか?私は、あなたが明日この3つのクラスのいずれかでもっと論理的だと思うなら、明日何か他のものになる可能性があることを保証することができます。これは重複していて、探しているコードがどこにあるのかを見つけるのが難しいことにつながります。代わりに、SaleHandlerのようなサービスクラスを使用して、データクラスを操作する方法を知ることができます。

可能性の高いものを使用するには、フレームワークを使用して相互に注入することをお勧めします(dependency injection)。 PHPコミュニティでは、たとえばSymfony2にこれを実装する良い例があります。


要約すると:あなたはフレームワークを持っていない場合

  • 、シングルトンは確かに良いオプションです。

  • フレームワークをお持ちの場合は、依存性注入機能を使用してそのようなことをしてください。

  • 静的メソッドは使用しないでください。クラスの1つに静的メソッドが必要な場合は、このメソッドを含む新しいシングルトン/サービスを作成し、それを必要とするクラスのインスタンスに挿入することができます。

+1

ネイティブでシンプルな機能を使用する代わりに、より複雑で冗長でエラーが発生しやすいシングルトンを使用する必要があります。同意しません。 – magallanes

2

ので、static方法では非常に基本的な違いがあります。

静的関数を使用するには、クラスをオブジェクトとして初期化する必要はありません。たとえば、Math.pow()、ここでは.pow()(Javaでは、説明は変わりませんが)は静的メソッドです。

一般的なルールはヘルパーメソッドを作成することですstatic

たとえば、Mathクラスを使用している場合は、ガベージコレクタに他の重要なクラスを助けるクラスを埋め込むことは望ましくありません。

あなたが好きな場合は、ダイナミックイニシャライザとして使用できます。

クラスRSAEncryptionHelperがあるとしましょう。パラメータを設定せずに一般的に初期化することができます。キーサイズが(例えば)512ビットのオブジェクトが生成されます。

$a = new RSAEncryptionHelper::fromPrimeSet(...); 
+0

私はそれを知っていた、私の質問は、私は10のメソッドを含むクラスがあります。そしてポイントは:私はいつもそれらの方法の1つを必要とします。だから、どちらのアプローチが私にとってより適切ですか? 'static'メソッドを使うか、それらのメソッドを普通に書くか? – stack

+2

静的メソッドを使用する方が良いでしょう。これらのメソッドへのアクセスが容易になり、ガベージコレクションが少なくなり、パフォーマンスが少し向上します。 :) – weirdpanda

+0

ありがとう! +1 – stack

1

答えは、これらのメソッドが何をするかによって異なりますが、あなたはまた、他のクラスからのすべてのプロパティを取得し、オーバーロードオブジェクトコンストラクタを持っています。手元にあるオブジェクトの状態を変更するためにそれらを使用している場合は、インスタンスメソッド呼び出しを使用する必要があります。彼らが独立した機能を持っているなら、静的なバージョンを使うことができますが、なぜそれらがクラスの一部であるのかという疑問があります。

+0

申し訳ありませんが、ありがとう、私はこれを取得していませんでした:*しかし、なぜ彼らはクラスの一部であるのか疑問に思っています。* – stack

+0

メソッド/関数はクラスの一部である必要はありませんPHPで。単純化された例から判断するのは難しいですが、それらがすべてクラスに関連していて、それがどのようなものであっても、そのクラスのメソッドを持つことは良いことです。彼らが別の懸念事項である場合、それらを分割する方が良いでしょう。 –

+0

ああ、ありがとう、+1 – stack

関連する問題