我写了一个mysql数据库操作类,然后对应每个表都写了一个model类,这些model都继承mysql数据库操作类。我的mysql数据库操作类是单例类形式的。昨天调试代码的时候追踪了一下运行流程,发现每个model文件运行的时候都会走一遍完整的mysqlconnectselectdb这些基础性的工作,这完全出乎我的意料,我希望达到的目标是像connectselectdb这种操作只运行一次,其他的每个model实例化的时候都只初始化tablename等一些变量,但是代码改了半天没改对,希望大神们帮忙看看,下面贴代码:Mysql操作类部分代码:publicstaticfunctiongetInstance($db='master1',array$config=[]){$config+=Yaf_Registry::get('config')->database['config'][$db]->toArray();static$_instance=[];empty($config['model'])&&$config['model']=get_called_class();$key=md5(implode(',',$config));if(empty($_instance[$key])){$instance=$_instance[$key]=newstatic($config);return$instance;}return$_instance[$key];}privatefunction__construct(array&$config){$this->_initConfig($config);$this->_initConnection();$this->_initTable($config);$this->release();}privatefunction_initConfig(array&$config){!empty($config['host'])&&$this->_config['host']=$config['host'];!empty($config['user'])&&$this->_config['user']=$config['user'];!empty($config['pass'])&&$this->_config['pass']=$config['pass'];!empty($config['data'])&&$this->_config['data']=$config['data'];!empty($config['port'])&&$this->_config['port']=$config['port'];!empty($config['char'])&&$this->_config['char']=$config['char'];!empty($config['pref'])&&$this->_config['pref']=$config['pref'];in_array($config['dbug'],[0,1])&&$this->_config['dbug']=$config['dbug'];in_array($config['dlog'],[0,1])&&$this->_config['dlog']=$config['dlog'];}privatefunction_initConnection(){$this->_conn=mysqli_connect($this->_config['host'],$this->_config['user'],$this->_config['pass'],$this->_config['data'],$this->_config['port'])ordie('connectdbfail('.mysqli_connect_errno().')'.mysqli_connect_error());mysqli_query($this->_conn,"setnames".$this->_config['char']);}model文件代码示例:classDb_UserModelextendsMySql{......}问题是每个model文件实例化时候都是通过getInstance,例如:Db_UserModel::getInstance()有多少个model被实例化,就会产生多少次数据库链接。求教如何改成我希望的那样呢?谢谢了。
2 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
static$_instance=null;if($_instance==null){$_instance=newstatic($config);}return$_instance;
互换的青春
TA贡献1797条经验 获得超6个赞
我目前的解决方法是把$_conn变量声明成了静态的了,所有调用$this->_conn都改成了self::_conn,好像达到了我的目的,但不知道有什么弊端没有,望各位大神不吝赐教。
添加回答
举报
0/150
提交
取消