PHP延遲靜態綁定

巴扎黑
發布: 2016-11-11 13:13:50
原創
932 人瀏覽過

最近專案中遇到這樣一個case,感覺所有的Model類別都須是單例效能更高.因為所有的model皆繼承統一父類別BaseModel,所以在BaseModel中加入控制單例的程式碼,簡單示範如下:

Java代碼  

/*基类*/  
class BaseModel  
{  
  
    private static $instance = null;  
  
    public static function instance()  
    {  
  
        if (empty(self::$instance)) {  
  
            self::$instance = new self();  
        }  
  
        return self::$instance;  
    }  
}
登入後複製

然後是各個邏輯子類Model 

Java代碼  

/*商品类*/  
class GoodModel extends BaseModel{  
  
    public function getInfoById($goodId){  
  
        return array(  
            'id'=>$goodId,  
            'name'=>'小苹果',  
            'logo'=>'http://t3.qlogo.cn/mbloghead/65518bb9e5287fcd5864/180'  
        );  
    }  
}  
  
################################################################  
$good = GoodModel::instance();  
  
var_dump($good);
登入後複製



這是就需要介紹self 

self::調用的變數只是該類別的即使該類別被繼承變數被重寫調用父類別裡的函數self::調用的變數還是輸出父類別的變數值而不會輸出被重寫的值


所以需要採用static關鍵字延遲靜態綁定,static代表了子類 
代碼如下 


Java代碼  

/*基類*/  
rrr

object(BaseModel)#1 (0) {  
}
登入後複製

其實也可用get_called_class函數來解決上面的問題,程式碼如下 

Java程式碼  

class BaseModel  
{  
  
    private static $instance = null;  
  
    public static function instance()  
    {  
  
        if (empty(self::$instance)) {  
  
            self::$instance = new static();  
        }  
  
        return self::$instance;  
    }  
}
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!