PHP延遲靜態繫結
最近項目中遇到這樣一個case,感覺所有的Model類都須是單例效能更高.因為所有的model皆繼承統一父類BaseModel,所以在BaseModel中添加控制單例的代碼,簡單示範如下:
/*基類*/class BaseModel{ private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; }}
然後是各個邏輯子類Model
/*商品類*/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);
此類$good 為
object(BaseModel)#1 (0) {}
非需要的GoodModel
這是就需要介紹self
self::調用的變數只是該類的 即使該類被繼承 變數被重寫 調用父類裡的函數 self::調用的變數還是輸出父類的變數值 而不會輸出被重寫的值
所以需要採用static關鍵字延遲靜態繫結,static代表了子類
代碼如下
/*基類*/class BaseModel{ private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new static(); } return self::$instance; }}
這時的$good 即為
object(GoodModel)#1 (0) {}
其實也可用get_called_class函數來解決上面的問題,代碼如下
class BaseModel{ private static $instance = null; public static function instance() { if (empty(self::$instance)) { $className = get_called_class(); self::$instance = new $className(); } return self::$instance; }}