2012-06-25 151 views
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. 一個單獨的類爲什麼兩種不同的方法出來同樣的結果?擴展了PHP

  2. 比較這兩種情況,該方法將在首先實例化類時運行。

(對不起,我不擅長英語,希望可以讓SENCE)

+0

你可以嘗試澄清你的問題嗎?什麼是你很奇怪,你在什麼情況下期待什麼......? – Styxxy

+0

單身人士只是「假全球人」。儘量避免它們。通常我也會擴展一個單身人士,這不再是「單身」。 – KingCrunch

回答

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(); 
4

你定義了兩個靜態函數,這兩者使用相同的靜態變量($ _instance) - 靜態基類的成員也可以通過子類訪問(只要它不是私有的)。請記住,靜態的東西(方法和變量)會被繼承,但不會被克隆。

解決方案:使成員變量爲私有,併爲每個類創建一個。

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

class Love extends LoveBase 
{ 
    private static $_instance = NULL; 
    // ... 
+0

我明白了,非常感謝! – ecco