0

私が使っているテクニックが適切かどうかはわかりません。次のようなサブインスタンスを持つシングルトンのクラスがあります。

final class Singleton {

    public $subinstance;
    private static $instance = NULL;

    private function __construct() {
        $this->subinstance = new subinstance(); 
    }

   public static function getInstance() {

       if (NULL === self::$instance) {
           self::$instance = new self;
       }

   return self::$instance;

   }

   private function __clone() {}
}

そして今、別のクラスのクラスの外部からサブインスタンスにアクセスしたい場合は、次のようにします。

$s = singleton::getInstance();
$s->subinstance->....

これはこれを行う正しい方法ですか?そして、私がそうするとどうなりますか$s=singleton::getInstance();、シングルトンクラス全体が$ sにコピーされますか、それともこれはポインタのようなものですか?

4

2 に答える 2

3

あなたがしていることは問題ありませんが、あなたのサンプルコードではあなたが書くつもりだったと仮定しています:

$s = Singleton::getInstance(); // with the S capitalized

getInstanceメソッドを呼び出すと、クラスはそれ自体のバージョンがすでにインスタンス化されているかどうかを確認します。ある場合は、まったく新しいインスタンスを作成するのではなく、そのインスタンスへの参照を返します。インスタンスがまだ作成されていない場合は、インスタンスを作成してから、そのインスタンスへの参照を返します。

sixeightzeroが、インスタンスのコンストラクターでクラスをインスタンス化するべきではないと述べた理由がわかりません。そうするときに問題が発生することはありません。

于 2012-06-07T19:16:11.493 に答える
0

$ a =シングルトンを実行すると、$aはシングルトンクラスへの参照になります。$ aの変更は、シングルトン::などによるアクセスに反映されます。(ポインタ)

コンストラクターでサブインスタンスを実行するのはなぜですか?これにより問題が発生する可能性があるため、保護されたメソッド内のコンストラクター外のサブインスタンスを処理するメソッドを作成する必要があります。あなたのサブインスタンスはどのように見えますか?

于 2012-06-07T19:11:52.567 に答える