PHP设计模式(二)
目录结构
1)适配器模式
可以将截然不同的函数接口封装成统一的API ,实际应用举例,php的数据库操作有mysql,mysqli,pdo 3种,可以用适配器模式统一成一致。类似的场景还有cache适配器,将memcache,redis,file,apc等不同的缓存函数,统一成一致。 实现方式,定义统一的接口
Config\Idb.php
<?php namespace Config; interface IDb{ function connect($host,$user,$passwd,$dbname); function query($slq); function close(); }
然后在对应的文件里面继承这个接口,然后按照各自的规则实现定义的这几个类
Config\Db\Mysql.php
<?php namespace Config\Db; use Config\IDb; class Mysql implements IDb{ protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = mysql_connect($host, $user, $passwd); mysql_select_db($dbname, $conn); $this->conn = $conn; } function query($sql) { $res = mysql_query($sql,$this->conn); return $res; } function close(){ mysql_close($this->conn); } }
Config\Db\Mysqli.php
<?php namespace Config\Db; use Config\IDb; class Mysqli implements IDb{ protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = mysqli_connect($host,$user,$passwd,$dbname); $this->conn = $conn; } function query($sql) { $res = mysqli_query($this->conn,$sql); return $res; } function close(){ mysqli_close($this->conn); } }
Config\Db\Pdo.php
<?php namespace Config\Db; use Config\Idb; class Pdo implements IDb{ protected $conn; function connect($host, $user, $passwd, $dbname) { $this->conn = new \PDO("mysql:host=$host;dbname=$dbname",$user,$passwd); } function query($sql) { $res = $this->conn->query($sql); return $res; } function close(){ unset($this->conn); } }
去创建对应的适配器实例。 然后调用的时候,就看引入那个数据类型的文件,就使用对应的方法。
index.php
<?php define('BASEDIR',__DIR__); require_once('/Config/Loader.php'); spl_autoload_register('\\Config\\Loader::autoload'); $db = new \Config\Db\Pdo(); $db->connect('localhost','root','123456','test'); $res = $db->query('select * from class'); foreach ($res as $val) { var_dump($val); }; $db->close();
2)策略模式
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。
实例:加入一个电商网站系统,针对男女性用户要各自跳转到不同的商品类目,并把所有广告位展示不同的广告。
正常的开发中,都是用if else来判断男女加载不同的信息。
实现Ioc,依赖倒置,控制反转。
实现方式:
通过创建一个接口,把相应的方法定义出来,然后再创建对应的类来继承这个接口。并实现这些方法。
Config\UserStartege.php
<?php namespace Config; interface UserStratege { function showAd(); function showCategory(); }
Config\MaleStartege.php
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/5/13 * Time: 14:09 */ namespace Config; class MaleStratege implements UserStratege { public function showAd() { echo "AD:"; echo "SONY XBOX"; echo "</br>"; } public function showCategory() { echo "Category:"; echo "男人"; } }
Config\FemaleStartege.php
<?php namespace Config; class FemaleStratege implements UserStratege { public function showAd() { echo "AD:"; echo "新款女装"; echo "</br>"; } public function showCategory() { echo "Category:"; echo "女人"; } }
然后再使用的时候,根据实际情况调用对应的策略。然后先调用set方法来设置策略生成的的东西,然后index函数来展示。
index.php
<?php define('BASEDIR',__DIR__); require_once('/Config/Loader.php'); spl_autoload_register('\\Config\\Loader::autoload'); class page { /** * @var \Config\UserStratege; */ protected $stratege; public function index() { $this->stratege->showAd(); $this->stratege->showCategory(); } public function setStratege(\Config\UserStratege $stratege) { $this->stratege = $stratege; } } $page = new page(); if(isset($_GET['female'])){ $stratege = new \Config\FemaleStratege(); }else{ $stratege = new \Config\MaleStratege(); } $page->setStratege($stratege); $page->index();
控制反转: 可以很方便的替换两个相关联的类
3)数据对象映射模式
是将对象和数据存储映射起来,对一个对象操作会映射为对数据存储的操作。
在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性的操作。
结合使用数据对象映射模式,工厂模式,注册模式。
这样就可以屏蔽底层的数据操作。
student表DDL
CREATE TABLE `student` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `age` int(10) NOT NULL, `sex` int(1) NOT NULL, `class_id` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
Config\Student.php
<?php namespace Config; class Student { public $id; public $name; public $age; public $sex; public $classid; protected $db; public function __construct($id) { $this->db = new \Config\Db\Mysqli(); $this->db->connect('localhost','root','123456','test'); $res = $this->db->query('select * from student limit 1'); $data = $res->fetch_assoc(); $this->id = $data['id']; $this->name = $data['name']; $this->age = $data['age']; $this->sex = $data['sex']; $this->classid = $data['class_id']; } public function __destruct() { $this->db = new \Config\Db\Mysqli(); $this->db->connect('localhost','root','123456','test'); $this->db->query("update student set name = '{$this->name}',age = {$this->age},sex = {$this->sex},class_id={$this->classid} WHERE id = {$this->id}"); } }
Config\Foctory.php
<?php namespace Config; class Factory { static public function createDb() { $db = Db::getInstance(); Register::set('db',$db); } static public function getStudent($id) { $key = 'student_'.$id; if(Register::get($key)){ return Register::get($key); }else{ $model = new \Config\Student($id); Register::set($key,$model); } return Register::get($key); } }
index.php
<?php define('BASEDIR',__DIR__); require_once('/Config/Loader.php'); spl_autoload_register('\\Config\\Loader::autoload'); class page { public function index() { $student = \Config\Factory::getStudent(1); $student->name = 'dada6'; $this->test(); } public function test() { $student = \Config\Factory::getStudent(1); $student->classid = 1; } } $page = new Page(); $page->index();
这个就是yii的model实现数据库操作的设计模式。
就是在控制器层不出现sql语句,然后再model里面,__construct
这个构造函数中创建数据库连接,然后在__destruct
析构函数中,将属性保存到数据库里面,使用sql的update操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)