このようなコードは見たことがありません:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
と同じですかnew className()
?
編集
クラスが継承クラスである場合、どのクラスを指しますか?
ベストアンサー1
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 では、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 マニュアルの [Late Static Bindings][1] ページを参照することをお勧めします。