私はこのようなコードを見たことがありません:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
それは同じnew className()
ですか?
編集
クラスが継承の場合、どのクラスを指しますか?
私はこのようなコードを見たことがありません:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
それは同じnew className()
ですか?
編集
クラスが継承の場合、どのクラスを指しますか?
回答:
self
それが書かれているクラスを指します。
したがって、getInstanceメソッドがクラス名のMyClass
場合、次の行:
self::$_instance = new self();
と同じようになります:
self::$_instance = new MyClass();
編集:コメントの後にいくつかの情報を追加します。
互いに拡張する2つのクラスがある場合、2つの状況があります。
getInstance
子クラスで定義されていますgetInstance
親クラスで定義されています最初の状況は次のようになります(この例では、不要なコードをすべて削除しました。シングルトンの動作を取得するには、コードを再度追加する必要があります)*:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
ここでは、次のものが得られます。
object(MyChildClass)#1 (0) { }
意味self
の手段をMyChildClass
-すなわち、それが書かれているクラス。
2番目の状況では、コードは次のようになります。
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
そして、あなたはこの種の出力を得るでしょう:
object(MyParentClass)#1 (0) { }
どの手段のself
手段MyParentClass
-つまりここでも、それが書かれているクラス。
PHP <5.3では、「それが記述されているクラス」が重要であり、問題が発生する場合があります。
そのため、PHP 5.3ではstatic
キーワードの新しい使用法が導入されています。これはself
、これらの例で使用したとおりに使用できるようになりました。
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
しかし、static
ではなくself
、次のようになります。
object(MyChildClass)#1 (0) { }
これは、そのstatic
種類が、使用されている(私たちが使用したMyChildClass::getInstance()
)クラスを指すのであって、それが記述されているクラスを指すのではないことを意味します。
もちろん、self
既存のアプリケーションを壊さないようにの動作は変更されていません-PHP 5.3は新しい動作を追加し、static
キーワードをリサイクルしました。
また、PHP 5.3については、PHPマニュアルの「遅延静的バインディング」ページをご覧ください。
baseclass
、class
それはどちらををポイントしていますか?
self
、継承と継承についてもう少し詳しく説明しました。またstatic
、PHP 5.3 に関する情報も含まれています。; これがお役に立てば幸いです:-)
これはシングルトンパターンの実装のようです。この関数は静的に呼び出され、静的クラスに変数が$_instance
設定されているかどうかを確認します。
そうでない場合は、自身のインスタンスを初期化し(new self()
)、それをに格納し$_instance
ます。
あなたが呼び出す場合className::getInstance()
、あなたは取得する1と同じシングルトンパターンの時点ですべての呼び出し、上のクラスのインスタンスを。
しかし、これがこのように行われるのを私は見たことがありません。$_instance
クラスでは何が宣言されていますか?
$_instance
宣言されているpublic static $_instance;
これは、コンストラクターがインスタンス化されないようにプライベートとして定義されているシングルトンデザインパターンで最もよく使用されます。二重コロン(::)
演算子は、クラス内で静的と宣言されているメンバーにアクセスできるため、静的メンバーがある場合は、疑似変数$これは使用できないため、コードは代わりに自分自身を使用します。シングルトンは、データベースコネクタハンドラのようなオブジェクトのインスタンスを1つだけ許可する優れたプログラミング方法です。クライアントコードから、そのインスタンスへのアクセスは、単一のアクセスポイントを作成することによって行われます。この場合、彼はそれに名前を付けましたgetInstance()
。getInstance自体は、基本的に新しいキーワードを使用してオブジェクトを作成する関数であり、コンストラクターメソッドがとも呼ばれている。
この行if(!isset(self::instance))
は、オブジェクトがすでに作成されているかどうかを確認します。コードが単なるフラグメントであるため、これを理解できません。上部のどこかに、おそらく次のような静的メンバーがあるはずです
private static $_instance = NULL;
通常のクラスでは、単純にこのメンバーにアクセスしていました。
$this->_instance = 'something';
しかし、宣言された静的なので、代わりに使用する$ thisコードを使用できませんでした
self::$_instance
この静的クラス変数にオブジェクトが格納されているかどうかを確認することにより、クラスは単一のインスタンスを作成するかどうかを決定できるため、設定されていない場合は!isset、つまり静的メンバー$ _instanceにオブジェクトが存在しないことを意味します。新しいオブジェクトを生成$_instance
し、コマンドによって静的メンバーに格納します
self::$_instance = new self();
そしてそれをクライアントコードに返しました。その後、クライアントコードはパブリックメソッドでオブジェクトの単一のインスタンスを喜んで使用できますが、クライアントコードでは単一のアクセスポイントを呼び出す、つまり、getInstance()
メソッドもトリッキーなので、次のように呼び出す必要があります
$thisObject = className::getInstance();
理由は、関数自体が静的であると宣言されているためです。
はい、それはnew className()
(そのメソッドを含むクラスを参照)のようなもので、おそらくコンストラクターがプライベートであるシングルトンパターンで使用されます。