2012-06-25 116 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