zoukankan      html  css  js  c++  java
  • PHP面向对象之设计模式

    设计模式

    单例模式

    • 概念

      • 一个类只能有一个对象
    • 应用场景

      • 多次请求数据库只需要一个连接对象
    • 实现:三私一公

      • 私有的静态属性用来保存对象的单例
      • 私有的构造方法用来阻止在类的外部实例化
      • 私有的__clone阻止在类的外部clone对象
      • 公有的静态方法用来获取对象的单例
    <?php
    //三私一公
    class DB {
    	//静态的属性用来保存对象的单例
    	private static $instance;
    	//私有的构造方法阻止在类的外部实例化
    	private function __construct() {
    		
    	}
    	//私有的__clone()阻止在类的外部clone对象
    	private function __clone() {
    		
    	}
    	public static function getInstance() {
    		//保存的值不属于DB类的类型就实例化
    		if(!self::$instance instanceof self)
    			self::$instance= new self();
    		return self::$instance;
    	}
    }
    //测试
    $db1= DB::getInstance();
    $db2= DB::getInstance();
    var_dump($db1,$db2);
    ?>
    

    封装MySQL的单例模式

    • 分析
      • 实现单例模式
      • 初始化参数
      • 连接数据库
      • 对数据进行操作
        • 执行数据操作语句(增、删、改)
        • 执行数据查询语句
          • 返回二维数组
          • 返回一维数组
          • 返回一行一列
    <?php
    class MySQLDB {
    	private $host;				// 主机地址
    	private $port;				// 端口号
    	private $user;				// 用户名
    	private $pwd;				// 密码
    	private $dbname;			// 数据库名
    	private $charset;			// 字符集
    	private $link;				// 连接对象
    	private static $instance;
    	private function __construct($param){
    		$this->initParam($param);
    		$this->initConnect();
    	}
    	private function __clone(){
    
    	}
    	// 获取单例
    	public static function getInstance($param= array()){
    		if(!self::$instance instanceof self){
    			self::$instance= new self($param);
    		}
    		return self::$instance;
    	}
    	// 初始化参数
    	private function initParam($param){
    		$this->host= $param['host']??'127.0.0.1';
    		$this->port= $param['port']??'3306';
    		$this->user= $param['user']??'';
    		$this->pwd= $param['pwd']??'';
    		$this->dbname= $param['dbname']??'';
    		$this->charset= $param['charset']??'utf8';
    	}
    	// 连接数据库
    	private function initConnect(){
    		$this->link= @mysqli_connect($this->host, $this->user, $this->pwd, $this->dbname, $this->port);
    		if(mysqli_connect_error()){
    			echo '数据库连接失败<br>';
    			echo '错误信息:'.mysqli_connect_error(),'<br>';
    			echo '错误码:'.mysqli_connect_errno(),'<br>';
    			exit;
    		}else{
    			echo '数据库连接成功!';
    		}
    		mysqli_set_charset($this->link, $this->charset);	
    	}
    	// 数据库的增删改查
    	private function execute($sql){
    		if(!$rs= mysqli_query($this->link, $sql)){
    			echo 'SQL语句执行失败<br>';
    			echo '错误信息:'.mysqli_error($this->link),'<br>';
    			echo '错误码:'.mysqli_errno($this->link),'<br>';
    			echo '错误的SQL语句:'.$sql,'<br>';
    			exit;
    		}
    		return $rs;
    	}
    	// 执行增删改语句
    	public function exec($sql) {
    		$key=substr($sql,0,6);
    		if(in_array($key,array('insert','update','delete')))
    			return $this->execute($sql);
    		else{
    			echo '非法访问<br>';
    			exit;
    		}
    	}
    	//获取自动增长的编号
    	public function getLastInsertId() {
    		return mysqli_insert_id($this->link);
    	}
    	//执行查询语句
    	private function query($sql) {
    		if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){
    			return $this->execute($sql);
    		}else{
    			echo '非法访问<br>';
    			exit;
    		}
    	}
    	//匹配所有数据
    	public function fetchAll($sql,$type='assoc') {
    		$rs=$this->query($sql);
    		$type=$this->getType($type);
    		return mysqli_fetch_all($rs,$type);
    	}
    	//匹配一维数组
    	public function fetchRow($sql,$type='assoc') {
    		$list=$this->fetchAll($sql,$type);
    		if(!empty($list))
    			return $list[0];
    		return array();
    	}
    	//匹配一行一列
    	public function fetchColumn($sql) {
    		$list=$this->fetchRow($sql,'num');
    		if(!empty($list))
    			return $list[0];
    		return null;
    	}
    	//获取匹配类型
    	private function getType($type) {
    		switch($type){
    			case 'num':
    				return  MYSQLI_NUM;
    			case 'both':
    				return  MYSQLI_BOTH;
    			default:
    				return  MYSQLI_ASSOC;
    		}
    	}
    }
    
    $param= array(
    	'user' => 'root',
    	'pwd' => '',
    	'dbname' => 'sel'
    );
    $db= MySQLDB::getInstance($param);
    // 查询所有信息
    $listAll= $db->fetchAll('select * from news');
    var_dump($listAll);
    // 查询一条记录
    $listRow= $db->fetchRow('select * from news');
    var_dump($listRow);
    // 查询一个字段
    $listColumn= $db->fetchColumn('select * from news');
    var_dump($listColumn);
    ?>
    

    工厂模式

    • 特点
      • 传递不同的参数获取不同的对象
    <?php
    class ProductsA {
    }
    class ProductsB {	
    }
    //工厂模式
    class ProductsFactory {
    	public function create($num) {
    		switch($num) {
    			case 1:
    				return new ProductsA;
    			case 2:
    				return new ProductsB;
    			default:
    				return null;
    		}
    	}
    }
    //测试
    $factory= new ProductsFactory();
    $obj1= $factory->create(1);
    $obj2= $factory->create(2);
    var_dump($obj1, $obj2);
    ?>
    

    策略模式

    • 特点
      • 传递不同的参数调用不同的策略(方法)
    <?php
    class Walk {
    	public function way() {
    		echo '走着去<br>';
    	}
    }
    class Bus {
    	public function way() {
    		echo '坐车去<br>';
    	}
    }
    //策略模式
    class Student {
    	public function play($obj) {
    		$obj->way();
    	}
    }
    //测试
    $stu= new Student;
    $stu->play(new Walk());	//走着去
    $stu->play(new Bus());	//坐车去
    ?>
    
  • 相关阅读:
    Docker之路-docker架构
    Docker之路-认识docker
    Docker之路-版本选择及安装
    Golang理解-集合
    大话算法-动态规划算法
    运维职责
    Golang理解-匿名结构体
    DotNetty项目基本了解和介绍
    变量声明在循环体内还是循环体外的争论
    SqlServer与MySql语法比较
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117162.html
Copyright © 2011-2022 走看看