2
<?php
class LoveBase
{
    protected static $_instance = NULL;
    protected function __construct() {}
    public static function app()
    {
        if(self::$_instance == NULL) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function get()
    {
        return 'LoveBase';
    }

}

class Love extends LoveBase
{
    public static function app()
    {
        if(self::$_instance == NULL) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    public function get()
    {
        return 'Love';
    }
}

// Print "LoveLove" in this case(first case)
echo Love::app()->get(); 
echo LoveBase::app()->get();

// Print "LoveBaseLoveBase" in this case(second case)
// echo LoveBase::app()->get();
// echo Love::app()->get();
  1. 2 つの異なる方法で同じ結果が得られるのはなぜですか?

  2. 2 つのケースを比較すると、最初にクラスをインスタンス化するときにメソッドが機能します。

(すみません、私は英語が苦手です、うまくいけば意味を理解できます)

4

2 に答える 2

4

どちらも同じ静的変数 ($_instance) を使用する 2 つの静的関数を定義します。基本クラスの静的メンバーは、サブクラスを介してアクセスすることもできます (プライベートでない限り)。静的なもの (メソッドと変数) は継承されますが、クローンは作成されないことに注意してください。

解決策: メンバー変数を非公開にし、クラスごとに 1 つ作成します。

class LoveBase
{
    private static $_instance = NULL;
    // ...

class Love extends LoveBase
{
    private static $_instance = NULL;
    // ...
于 2012-06-25T17:16:52.760 に答える
0
// Print "LoveLove" in this case(first case)

//Set self::$_instance to Love object id
echo Love::app()->get(); 

//Static property $_instance is now already set, so LoveBase::app() won't create new self(), it will just return created and saved Love object
echo LoveBase::app()->get();

// Print "LoveBaseLoveBase" in this case(second case)

// Here is the same case, but static property $_instance filled with new self() in LoveBase class
// echo LoveBase::app()->get();
// echo Love::app()->get();
于 2012-06-25T17:16:39.337 に答える