簡體   English   中英

擴展PHP中的單例類

[英]extends a singleton class in PHP

<?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. 比較這兩種情況,該方法在類首次實例化時將起作用。

(對不起,我的英語不好,希望你能說出來)

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

解決方案:將成員變量設為私有,並為每個類創建一個。

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

class Love extends LoveBase
{
    private static $_instance = NULL;
    // ...
// 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM