私が働いてコードとその出力の下に考えてみましょうPHP 7.1.11オブジェクトを作成せずにコンストラクタを呼び出す方法は?コンストラクタが同じ方法で再び呼び出されないのはなぜですか?
を使用しています:
<?php
class butto {
public static $instance;
private function __construct() {
echo 'Contruct of butto class called</br>';
}
public static function get_instance() {
if(!static::$instance instanceof static) {
static::$instance = new static();
}
return static::$instance;
}
public function test() {
echo 'test function called</br>';
}
}
class B extends butto {
public static $instance;
protected function __construct() {
echo 'Construct of Class B called</br>';
}
public static function get_class_name() {
return __CLASS__;
}
}
butto::get_instance()->test();
B::get_instance()->test();
B::get_instance()->test();
/*Output : Contruct of butto class called
test function called
Construct of Class B called
test function called
test function called*/
?>
あなたが密接にコードを見ればあなたはクラスの両方のコンストラクタがあることを知って来ますいずれかのクラスのオブジェクトを作成しなくても呼び出されます。
静的メソッドに静的にアクセスしてもコンストラクタが呼び出されています。これまでは、コンストラクタの目的は、オブジェクトプロパティに初期値を設定し、オブジェクトプロパティが作成されるとすぐに使用できるようにするため、コンストラクタはオブジェクト作成時にのみ呼び出すことができることを知っていました。
これはどのように可能ですか?このようにコンストラクタを使用すると、オブジェクトを作成せずにアクセスする利点は何ですか?
は、コード行の下に考えてみましょう:
B::get_instance()->test();
B::get_instance()->test();
私の質問は、なぜ、クラスBのコンストラクタは、最初の行のみのために呼び出さなっているのですか?
2行目にももう一度呼び出されることになっています。
なぜこのような奇妙な仕方で動作していますか?
しかし静的メソッド ':: get_instance()'でオブジェクトを構築しています!名前:だから、あなたについて話しているか。さらに、 'static :: $ instance'と' new static() 'は' butto'の潜在的な派生語を参照します(これは 'self :: $ instance'と' new self() 'と対照的です)。自分のコンテキストから呼び出された場合、なぜそれぞれのコンストラクタも呼び出されるのです。 –
また、https://stackoverflow.com/questions/203336/creating-the-singleton-design-pattern-in-php5への回答もご覧ください。 – localheinz