最近項目中遇到這樣一個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);
此類$good 為
Java代碼
object(BaseModel)#1 (0) { }
非需要的GoodModel
這是就需要介紹self
self::調用的變數只是該類的 即使該類被繼承 變數被重寫 調用父類裡的函數 self::調用的變數還是輸出父類的變數值 而不會輸出被重寫的值
所以需要採用static關鍵字延遲靜態繫結,static代表了子類
代碼如下
Java代碼
/*基類*/
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new static(); } return self::$instance; } }
這時的$good 即為
Java代碼
object(GoodModel)#1 (0) { }
其實也可用get_called_class函數來解決上面的問題,代碼如下
Java代碼
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; } }