みんな!これは、レジストリ パターンの小さなシングルトンです。非常に一般的です。
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 を検索しましたが、答えが見つかりませんでした。私の英語があまり得意ではないからかもしれません。次に、正しい方向を示してください。
事前に助けてくれてありがとう!