0

私は次のクラスを持っています:

class DB {

    private $name;

    public function load($name) {
        $this->name = $name;
        return $this;
    }

    public function get() {
        return $this->name;
    }
}

現時点で私が行う場合:

$db = new DB();
echo $db->load('foo')->get() . "<br>";
echo $db->load('fum')->get() . "<br>";

これにより、「foo」、「fum」の順に出力されます。

ただし、これを行うと:

$db = new DB(); 
$foo = $db->load('foo');
$fum = $db->load('fum');
echo $foo->get() . "<br>";
echo $fum->get() . "<br>";

常に「fum」を出力します。

なぜそうするのかはある程度わかりますが、DBの新しいインスタンスを作成せずに、変数を各インスタンスに個別に保持するにはどうすればよいでしょうか?

4

3 に答える 3

2

インスタンスごとに分けておくには、定義上、新しいインスタンスを作成する必要があります...load()メソッド内でそれを行うこともできます。を返す代わりに$this、必要に応じて構成済みを返すことができnew DB()ます。次に、メソッドを静的にします。

これは、ファクトリ パターンと呼ばれるものです。

于 2011-06-13T14:56:22.193 に答える
2

DB がある種のデータベース接続オブジェクトであることを意味している場合 (私はそうであると想定しています)、複数のインスタンスは最良の選択ではない可能性があります。おそらく、このようなことがあなたがやろうとしていることかもしれません:

$db = new DB(); 
$foo = $db->load('foo')->get();
$fum = $db->load('fum')->get();
echo $foo . "<br>";
echo $fum . "<br>";

あなたがやろうとしていることが正しいと思うなら、getロジックをDBクラスから独自のRecordクラスに分離する方が良いかもしれません。

class Record {
    function __construct($name) {
        $this->name = $name;
    }

    function get(){
        return $this->name;
    }

    private $name;
}

class DB {

    public function load($name) {
        return new Record($name);
    }
}

$db = new DB(); 
$foo = $db->load('foo');
$fum = $db->load('fum');
echo $foo->get() . "<br>";
echo $fum->get() . "<br>";
于 2011-06-13T14:58:17.877 に答える
0

コードで経験していることは、PHP の参照渡し機能に似ています。

最初の変数を設定する$fooと、 の値に等しくなり、$db->nameもう一度呼び出して 'fum' に設定すると、$fumに等しく設定され$db->nameます。最後に両方をエコーし​​ているので、どちらも最後に設定した値になります。

これを試して、結果が異なるかどうかを確認してください。

$db = new DB(); 

$foo = $db->load('foo');
echo $foo->get() . "<br>";

$fum = $db->load('fum');
echo $fum->get() . "<br>";

を実行$db->load()すると、新しいオブジェクトが作成され、現在のオブジェクトの代わりにそれが返されます。

于 2011-06-13T15:02:27.587 に答える