0

みんな!これは、レジストリ パターンの小さなシングルトンです。非常に一般的です。

class REG {
    private $_objects;  
    protected static $_instance;

    private function __construct() {}

    public static function getInstance() {
        if (self::$_instance === NULL) self::$_instance = new self();  
        return self::$_instance;
    }

    public static function set($name, $object) {
        self::$_instance->_objects[$name] = $object;
    }

    public static function get($name) {
        return self::$_instance->_objects[$name];
    }   

    public static function testMe() {
        return self::$_instance;
    }       

    private function __clone() {}
    private function __wakeup() {}    
}

それを使用して、最初に呼び出しREG::getInstance()、次に任意のメソッドを呼び出す必要があるとします。

REG::getInstance();
REG::set('name','Denis');
var_dump(REG::testMe());
// object(REG)#1 (1) { ["_objects":"REG":private]=> array(1) { ["name"]=> string(5) "Denis" } }

すべてがうまくいきます!しかし...このクラスを使用してプロジェクトのグローバル変数を保存することを計画しているので、func内のグローバル変数にアクセスする必要があるたびに余分な行を費やしたくありません。上記の例では、呼び出しを省略できREG::getInstance()、スクリプトを実行してもエラーは発生しません。唯一の違いはself::$_instance、stdClass のインスタンスになることです。

REG::set('name','Denis');
var_dump(REG::testMe());
// object(stdClass)#1 (1) { ["_objects"]=> array(1) { ["name"]=> string(5) "Denis" } }

この特定のケースでは違いはありませんが、クラスに追加機能が必要な場合は、これが重要になる可能性があります。for の呼び出しを避けるもう 1 つの方法は、クラスのすべてのメソッドに行を追加することですREG::getInstance()if (self::$_instance === NULL) self::$_instance = new self();

class REG {
    private $_objects;  
    protected static $_instance;

    private function __construct() {}

    public static function getInstance() {
        if (self::$_instance === NULL) self::$_instance = new self();  
        return self::$_instance;
    }

    public static function set($name, $object) {
        if (self::$_instance === NULL) self::$_instance = new self();  
        self::$_instance->_objects[$name] = $object;
    }

    public static function get($name) {
        if (self::$_instance === NULL) self::$_instance = new self();  
        return self::$_instance->_objects[$name];
    }   

    public static function testMe() {
        if (self::$_instance === NULL) self::$_instance = new self();  
        return self::$_instance;
    }       

    private function __clone() {}
    private function __wakeup() {}    
}
REG::set('name','Denis');
var_dump(REG::testMe());
// object(REG)#1 (1) { ["_objects":"REG":private]=> array(1) { ["name"]=> string(5) "Denis" } }

今は大丈夫です!
だから、私が聞きたい質問=)このアプローチを使用して、見過ごされている短所はありますか? おそらく、望ましくないリソースのオーバーヘッドか何かでしょうか?

PS: この質問をする前に SO を検索しましたが、答えが見つかりませんでした。私の英語があまり得意ではないからかもしれません。次に、正しい方向を示してください。
事前に助けてくれてありがとう!

4

1 に答える 1

0


誰かが私の考えを気に入らない理由をハマーでアリを殺そうとしているのかもしれません:

class REG {
public function data($name, $value=null){
if(!$value) return $this->{$name};
$this->{$name} = $value;
}
}
$bin = new REG();
$bin->data('working','no');
echo $bin->data('working');

編集

あなたは私のオブジェクト指向の心を傷つけました

さて、あなたはあなたの粒子を保存するためのバケツを作成したいと思います、そしてそれをすべてのクラスの人々に利用可能にします。
しかし、それらをビンに保管して、それを必要とする人に渡したらどうなるでしょうか。
OOPにはカプセル化のアイデアが付属しています。しかし、シングルトンはそれを傷つけます。あなたの変数はグローバルに利用可能になるからです。
もう1つのことは、OOPには優れたコードの再利用性のアイデアが付属していることです。
しかし、singltonから呼び出された関数を使用してクラスを作成するとどうなりますか。次回は、シングルトンとメインクラスの両方を使用する必要があります。

したがって、singltonを使用することにした場合。多くの人が使っているのでそれほど悪くはありません。
ただし、**変数を必要とする関数にパラメーターとして変数を渡すことをお勧めします。
それを読む時間を持ってくれてありがとう。繰り返しますが、私はあまり経験がありません。私は17歳です。

于 2013-03-22T14:02:03.127 に答える