實際需求:在控制器中需要對當(dāng)前訪問者進(jìn)行權(quán)限判斷。權(quán)限內(nèi)容保存在磁盤文件中data.db,文件容量大概1MB。
目前做法:因為也只有幾個路徑需要進(jìn)行判斷,沒有使用中間件,而是在基類中使用beforeAction來執(zhí)行判斷。
//權(quán)限判斷偽代碼
class AbcUtil
{
private static $instance = null;
private static $db = null;
private function __construct(){
self::$db = file_get_contents('data.db');
echo 'init';
}
private function __clone() {}
public static function getInstance(){
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
public function check($a){
//TODO .....
}
}
//基類Base中beforeAction使用
Base.php
public function beforeAction(Request $request){
AbcUtil::getInstance()->check($request);
}
A extends Base {
a(){}
b(){}
}
B extends Base {
c(){}
d(){}
}
依次執(zhí)行控制器中的方法:
a()會打印init
b()不打印
c()打印init
d()不打印
a()不打印
b()不打印
我的疑問是,單例不是全局中只有一個實例么?上面多次打印init就是進(jìn)行了多次實例化,因為初始化要從磁盤上讀取文件內(nèi)容,這樣會不會有性能問題?
我想實現(xiàn)的是應(yīng)用啟動后只進(jìn)行一次資源讀取,后面只從內(nèi)存讀取,感覺我上面的做法不太合理。資源初始化應(yīng)該在哪里進(jìn)行呢?
謝謝大家不吝指教!