php设计模式

参考来源:https://designpatternsphp.readthedocs.io/zh_CN/latest/README.html#

数据库单例模式代码:

 <?php
     //先建立单模:三私(私有变量、私有构造函数、私有的__clone函数)一公(公有方法),再封装连接数据库,以及返回结果
     class MySQLDB{
         //定义连接数据库需要用到的私有属性
         private $host;    //主机id
         private $port;    //端口号
         private $user;    //用户
         private $psw;    //密码
         private $dbname;        //数据库名称
         private $charset;        //字符集
 
         //定义静态变量保存当前类的实例
         private static $instance;
         //防止在外部实例化
         private function __construct($config){
             $this -> initParam($config);//初始化参数-----实例化时自调用
             $this -> initConn();//连接数据库-------因为已经初始化了,现在所有参数已经是我们需要的参数了,所以不需要再带参数了
             $this -> initDB();//选择数据库
             $this -> initCharset();//选择字符集
         }
 
         //防止在外部克隆
         private function __clone(){
 
         }
         //通过静态公有的方法获取这个类的实例
         public static function getInstance($config){
             //当前对象不属于当前例就实例化,也就是静态变量在当前类中只能实例化一次,若是第一次实例化就实例化,若第二次实例化就返回一个当前的实例值。
             if (!self::$instance instanceof self) {
                 self::$instance = new self($config);
             }
             return self::$instance;
         }
         //初始化成员变量
         private function initParam($config){
             $this -> host = isset($config['host']) ? $config['host'] : 'localhost';
             $this -> port = isset($config['port']) ? $config['port'] : 3306;
             $this -> user = isset($config['user']) ? $config['user'] : 'root';
             $this -> psw = isset($config['psw']) ? $config['psw'] : '';
             $this -> dbname = isset($config['dbname']) ? $config['dbname'] : '';
             $this -> charset = isset($config['charset']) ? $config['charset'] : 'utf8';
         }
         //连接数据库
         private function initConn(){
             $link = mysql_connect("{$this -> host}:{$this -> port}" , $this->user ,$this->psw);
             //判断数据库连接是否成功
             if (!$link) {
                 echo "mysql连接错误,错误原因如下:<br />";
                 echo "错误代码:".mysql_errno().'<br />';
                 echo "错误信息:".mysql_error();
                 exit;
             }
         }
         //选择数据库
         private function initDB(){
             //mysql_select_db('{$this -> dbname}');
             $this -> query("use `{$this -> dbname}`");
         }
         //选择字符集
         private function initCharset(){
             //mysql_query('set names `{$this -> charset}`');
             $this->query("set names {$this->charset}");
         }
         //封装一个执行SQL语句的方法
         /**
          * @param  $sql string 执行的SQL语句
          * @return $result 如果是数据查询语句返回结果集,如果是数据操作语句返回true,false
          */
         private function query($sql){
             if (!$result = mysql_query($sql)) {
                 echo 'SQL语句执行失败。<br />';
                 echo '错误号是:'.mysql_errno().'<br />';
                 echo '错误信息:'.mysql_error().'<br />';
                 echo '错误的SQL语句是:'.$sql.'<br />';
                 exit;
             }
             return $result;
         }
 
         /**
          *    获得所有的数据
          *     @param  $sql string 执行SQL
          *     @param  $type string 匹配的类型     assoc||array||row 
          *     @return   $result array 返回值为二维数组
          */
         public function fetchAll($sql,$type = 'assoc'){
             $res = $this -> query($sql); //返回的是资源的结果集
             //定义一个数组来保存允许匹配的类型
             $allow_array = array('assoc','array','row');
             if (!in_array($type, $allow_array)) {
                 $type = 'assoc';
             }
             $fn = 'mysql_fetch_'.$type;
             //将一条结果转成二维数组
             $result = array();
             while ($rows = $fn($res)) {
                 $result[] = $rows; 
             }
             return $result;
         }
 
         /**
          * *    获取一条数据
          *     @param  $sql string 执行SQL
          *     @param  $type string 匹配的类型     assoc||array||row 
          *     @return   $result array 返回值为一维数组
          */
         public function fetchRow($sql,$type = 'assoc'){
             $result = $this -> fetchAll($sql,$type);
             if(!empty($result)){
                 return $result[0];//返回第一行
             }
             return $result;
 
         }
 
         /**
          *     获取一行一列
          *     @param  $sql string 执行SQL
          *     @param  $type string 匹配的类型     assoc||array||row 
          *     @return   $result string 返回值为一行一列
          */
         public function fetchColumn($sql){
             $result=$this->fetchRow($sql,'row');
             if(!empty($result)){
                 return $result[0];    //返回一行一列
             }
             return $result;
         }
 
 
 
     }
     //设置响应头,防止乱码
     header('Content-type:text/html;charset=utf-8');
     $config = array(
         'host' => 'localhost',
         'port' => 3306,
         'user' => 'root',
         'psw' => 'mysql',
         'dbname' => 'oop',
         'charset' => 'utf8'    
         );
     $db = MySQLDB::getInstance($config);//获取对象的实例
     $rs = $db -> fetchAll('select * from star');//自己选择要执行的SQL语句
     echo '<pre>';
     var_dump($rs);

 

posted @ 2021-01-29 14:46  1O(∩_∩)O1  阅读(66)  评论(0编辑  收藏  举报