5

名前空間の代わりに静的クラスを使用することについて、人々の意見を評価したいと思っています。私は C++ のバックグラウンドを持っており、その構文とコードを構造化する方法が非常に気に入っています。最近、ファイルだけでなく、コードを論理ユニットにグループ化する必要があると判断しました。たとえば、私は User::login よりも user_login のような呼び出しを好みます。そこで、少しグーグルで調べてみたところ、PHP に名前空間があることがわかって安心しました。私の安堵は長続きしませんでしたが、私は構文が本当に好きではありません。それは私の関数呼び出しにさらに混乱を加えます。そのため、現時点では静的クラスを使用して名前空間をシミュレートしています。これには欠点がありますか?

PHP Namespaces vs Classes with static functionsで同様の質問を見つけましたが、それほど多くの議論はありませんでした。

また、次の状況を回避する方法はありますか。

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

 }
}

名前を指定せずに同じクラスの関数を呼び出しても問題ないと思いましたが、どうやらそうではないようです。そのための回避策はありますか (たとえば、C++ では using キーワードがあります)。

4

2 に答える 2

5

偶然にも、私は実際には正反対の方向に進んでいます。

  1. 名前空間を使用してドメイン クラス (または関数) を整理する
  2. 静的クラスを使用していたはずの依存性注入を使用する

名前空間をシミュレートするための静的クラスに関する問題は、それらを複数のファイルにまたがって整理できないことです。すべてを 1 つのファイル内で定義する必要があります。これは個人の好みによるかもしれません。

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

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

于 2012-08-14T04:03:05.103 に答える
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 ではありません。あなたはそれを偽造しているだけです。代わりに、依存性注入を使用して実際の OOP を使用する必要があります。

コードがあらゆる場所で静的メソッドと変数を使用している場合、クラス間の密結合が発生し、グローバル状態が追加され、コードベースの保守とテストが難しくなります。これは PHP 固有のものではありません。

于 2012-08-14T04:05:49.670 に答える