-2

私が働いてコードとその出力の下に考えてみましょう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行目にももう一度呼び出されることになっています。

なぜこのような奇妙な仕方で動作していますか?

+0

しかし静的メソッド ':: get_instance()'でオブジェクトを構築しています!名前:だから、あなたについて話しているか。さらに、 'static :: $ instance'と' new static() 'は' butto'の潜在的な派生語を参照します(これは 'self :: $ instance'と' new self() 'と対照的です)。自分のコンテキストから呼び出された場合、なぜそれぞれのコンストラクタも呼び出されるのです。 –

+0

また、https://stackoverflow.com/questions/203336/creating-the-singleton-design-pattern-in-php5への回答もご覧ください。 – localheinz

答えて

1

あなたのget_instance()自体に論理があるためです。静的変数にインスタンスを割り当てています。静的変数は、同じクラスの異なるインスタンス間で「共有」されます。したがって、初めて関数get_instance()を呼び出すと、オブジェクトが作成され、静的変数$instanceに格納されます。次回は、同じ関数を呼び出すときにif条件がfalseになるため、新しいオブジェクト/インスタンスを作成する必要はありません。再び次のコードを見てください:

public static function get_instance() { 
    if(!static::$instance instanceof static) { 
    static::$instance = new static(); 
    } 
    return static::$instance; 
} 

それは奇妙な方法で動作していないが、あなたのコードが動作するようにそれを尋ねたとして、それが動作しています。

関連する問題