PHP设计模式(二)

目录结构

qq%e5%9b%be%e7%89%8720170513193220

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操作。

posted @   xiaobingch  阅读(152)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示