6

PHP での静的メソッドの正しい使用法については、少しよくわかりません。

以下のシナリオでは:

<?php

class Person 
{
    public $data;

    public function __construct($id) 
    {
        // Fetch record from our data source
        switch($id){
            case 1:
                $this->data = array('id'=>1, 'name'=>'Mike');
                break;
            case 2:
                $this->data = array('id'=>2, 'name'=>'Jennifer');
                break;
            default:
                exit('Record not found!');
        }
    }

    public function getName()
    {
        return $this->data['name'];
    }

    public static function getInstance($id)
    {
        return new self($id);
    }
} 

?>

次に、「Mike」と「Jennifer」という名前を出力します。

例A

<?php 

foreach(array(1,2) as $id) 
    echo Person::getInstance($id)->getName(); 

?>

例 B

<?php 

foreach(array(1,2) as $id){
    $person = new Person($id);
    echo $person->getName();
}

?>

どちらも「MikeJennifer」を出力しますが、「Person は静的クラスではないため」、例 Aは間違っていると言われました。

ただし、PHP ではクラスを「静的」と宣言することはできません。

4

1 に答える 1

4

「Emergent Design」で、Scott L Bain はこれを、オブジェクトの作成を抽象化する最初のステップのパターンとして説明しています。

1日目: 抽象化なし...

$person = new Person($id);

2 日目: オブジェクトを構築するための静的メソッド...

$person = Person::getPerson($id);

なんで?アプリケーション全体で、その知識を持つ多くのコード行をアプリケーション全体に分散させるのではなく、人を「新しく」する方法を知っているコードがアプリケーション全体に 1 つしかないためです。将来、人物オブジェクトの作成方法を変更する場合は、getPerson静的メソッドを変更するだけで済みます。

3 日目以降: オブジェクトを作成するために、オブジェクト ビルダーまたはリポジトリに依存することを決定する場合があります。これを行うことを選択したgetPerson場合、ビルダー/リポジトリを使用するように静的メソッドを更新すると、変更は 1 か所だけで発生します。

これを「結束」といいます。多くのファイルを開かなくても変更できるコードを用意する。

于 2013-07-04T22:01:47.307 に答える