3

静的関数をいつ使用すべきかを学習しようとしていますが、質問の答えを見つけるのに苦労しました。Userクラスに関連するクラスを作成していGroupます。ユーザーIDがあり、そこからユーザーオブジェクトを取得したい場合は、次のようなことを行う方がよいでしょう。

$existingUser = User::get($userId); 

クラスはこのように定義されています

class User()
{ 
    public static function get($id){
        $user = new User();
        return $user->findById($id);
    }
    public function findById($id) {
        //find and populate user object
    }
}

また

$existingUser=new User();
$existingUser->findById($userId);

クラスはこのように定義されています

class User()
{ 
    public function findById($id) {
        //find and populate user object
    }
}

ユーザーIDに基づいてGroupオブジェクトの配列を返す関数を作成した場合はどうなりますか?

class User()
{ 
    //stuff
    $groupArray = Group::getAllByUserId($this->getId())
    //stuff
}

また

class User()
{ 
    //stuff
    $group = new Group();
    $groupArray = $group->findAllByUserId($this->getId());
    //stuff
}

2番目のメソッドは、使用されない空のグループオブジェクトを作成します。それは重要ですか?静的の概念を誤解していますか?クラスをインスタンス化する必要がないので便利だと思いますが、とにかく関数がクラスをインスタンス化すると、そのような目的は無効になりますか?もしそうなら、静的関数が使用される場合の例は何でしょうか?

この単純化された例で他に考慮すべきことはありますか?

4

4 に答える 4

0

上に示した場合、静的関数は必要ありません。

静的関数は、実際には名前空間を持つ単なるグローバル関数です。

アプリケーションのグローバル状態を制御する必要がある場合、または関数の複数のコピーが一貫性のない結果につながる場合に使用します。

コールバックは、特に文字列として渡される場合は、静的である必要がある場合があります。

于 2011-09-16T22:41:10.457 に答える
-2

静的関数をいつ使用すべきかを学ぼうとしています

ああ、それはとても簡単です:決して

それを理解するには、
http :
//www.objectmentor.com/resources/articles/ocp.pdfhttp ://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/をお読みください。

于 2011-09-16T22:48:21.373 に答える
-2

「[クラス名]がない場合、[メソッド名]を呼び出せると思いますか?」という経験則があります。

ユーザーがいない場合、findByIDを呼び出せると思いますか?おそらくそうではありません。これは私が遭遇した例外の1つです。「ロード」または「保存」メソッドは、静的であることが理にかなっている場合があります。

非静的メソッドを使用する場合の完璧な例は、Databaseクラス(のほとんどのメソッド)です。クエリを実行する前に、常にデータベースオブジェクトが必要です。

静的メソッドを使用する場合の例は、基本的に便利な関数のコレクションである「ヘルパー」クラスです。HTMLの出力に役立つメソッドがいくつかあるとします。たとえば、、、がHTML::image()ありHTML::url()ますHTML::script()。これらでは、画像やURLなどを作成するためにHTMLオブジェクトは必要ありません。

作成中のオブジェクトの複数のコピー(静的メソッドを使用するための1つの引数)を停止する場合は、代わりにシングルトンパターン(Google it)を使用して、オブジェクトのコピーが1つだけ存在するようにする必要があります。

于 2011-09-16T22:43:14.480 に答える
-2

ActiveRecordとデータマッパーでこの質問を確認する必要があります。

https://stackoverflow.com/questions/2169832/data-mapper-vs-active-record

この質問からの1つの見解は、ロード/保存のためのクラスの静的メソッドは、ほとんどの場合、実際にはクラスのコア機能ではないということです。さらに、保存と読み込みは一種の抽象的な概念であり、ほとんどの場合、クラスオブジェクトとは別のものです。

「ユーザー」はデータの保存と取得のオブジェクトですか?ほとんどの場合、いいえ、それはさまざまな特性と機能を持っているあなたのシステムで表される人です。そのオブジェクトの永続性をオブジェクトに結び付け始めると、カプセル化が破られ、コードの保守が難しくなります。来週、ユーザーをmemcacheからロードしたい場合はどうなりますか?ユーザーが何らかのプロパティや機能を持つことができるかどうかはほとんど関係ありません。

于 2011-09-16T22:37:03.553 に答える