PHP で new self(); とはどういう意味ですか? 質問する

PHP で new self(); とはどういう意味ですか? 質問する

このようなコードは見たことがありません:

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) { }

つまりselfMyParentClassここでも、それが書かれたクラス




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] ページを参照することをお勧めします。

おすすめ記事