2012-08-14 7 views
5

名前空間の代わりに静的クラスの使用に関する人々の意見を測定したいと思います。私はC++のバックグラウンドから来て、シンタックスとそれがどのようにしてコードを構造化するかがかなり好きです。私は最近、単なるファイルではなく論理ユニットに自分のコードをグループ化する必要があると決めました。例えば、私はUser :: LoginへのUser :: loginのような呼び出しを好みます。だから、私は少しのグーグルを行い、PHPが名前空間を持っていることを知って安心しました。私の安堵は長く続きませんでしたが、私は本当に構文が嫌いです。それは私の関数呼び出しに混乱を加えます。ですから、私は静的クラスを使って名前空間をシミュレートしています。これには欠点がありますか?PHPスタティッククラスまたはネームスペース

私は同様の質問をPHP Namespaces vs Classes with static functionsに見つけましたが、議論はあまりありませんでした。

また、次のような状況を回避する方法があります:

class Test { 
public static void myFunc() { 
    Test::myOtherFunc(); 
} 
public static void myOtherFunc() { 

} 
} 

私は名を指定せずに、同じクラス内の関数を呼び出すために、OKだろうと仮定は、どうやらありません。そのための回避策はありますか(たとえばC++ではusingキーワードを使用しています)。私はそうでない場合は、静的クラス を使用していたドメインクラス(または関数)

  • 使用依存性の注入を整理する

    1. 使用名前空間:偶然
  • +0

    'self ::'と '$ this->'はそれぞれ独自の静的メソッドとインスタンスメソッドを呼び出すためにPHPで使用されます。 –

    +0

    資格を暗黙的に指定する方法はありませんか?つまり、関数の現在のクラスをチェックするか? – user1520427

    +1

    いいえ、私は良いことが明白です:) –

    答えて

    5

    は、私が実際に正反対の方向に移動してきました

    静的クラスを持つ名前空間をシミュレートすることは、複数のファイルにまたがって構成することができず、すべてが1つのファイル内で定義されていることです。これは個人的な趣向によるものかもしれません。

    静的クラスに関するもう1つのことは、状態なしで開始し、ゆっくりといくつかの状態管理がうまくいくということです。あなたは奇妙なロックイン依存関係に陥ります。州はインスタンスのために予約する必要があります。現在、私の注目すべき静的クラスは、サイト全体の構成です。

    最後に、静的クラスでの自己参照は明示的ですが、名前空間ではC++とまったく同じように動作します。関数名を指定すると、まず名前空間内で検索されます。

    +0

    私は、複数のファイルにまたがって名前空間を整理することができると言っているように、名前空間の考え方やコード管理の仕方が気に入っています。私の唯一の不満は、ぎこちない構文です。 \を使用して他の言語との一貫性を取り除く必要はありません。 – user1520427

    +0

    @ user1520427私はあなたの気持ちを知っています、それは素晴らしい見物人ではありませんが、それをディレクトリ構造のものと考えると意味があります:)デフォルトのオートローダーは実際にそれを使います。 –

    4

    コード構造の観点から見ると、静的クラスメソッドと名前空間関数の間に違いはありません。どちらもグローバルスコープになります。違いは、静的なクラスメソッドでは、あなたはOOPを偽造しようとしているということです。

    本当に必要なものがスタンドアロン/ユーティリティー機能の場合は、名前空間付きの関数を使用する方がよいです。名前空間は、物事をグループ化するためのものです(関数とクラスの両方)。

    例としては、User::login()は悪い習慣です。代わりに、状態を含むことができる実際のオブジェクトを用意する必要があります。

    $mapper = new UserMapper; 
    $user = new User; 
    $user->setNickname($name); 
    
    $mapper->fetch($user); 
    
    if ($user->hasPassword($password)) 
    { 
        $user->setLastLogin(time()); 
    } 
    else 
    { 
        // log the access attempt 
        // set error state 
    } 
    
    $mapper->save($user); 
    

    一番下の行はこれです:あなたは、静的な構造(関数やメソッド)を使用している場合、それはOOPではありません。あなたはただそれを偽っているだけです。代わりにdependency injectionと実際のOOPを使用する必要があります。

    コードが静的メソッドと変数を使用している場合は、クラス間の密結合が発生し、global stateを追加してharder to maintain and testコードベースにします。これはPHP固有のものではありません。

    関連する問題