PHP设计模式
2021/7/25 22:05:48
本文主要是介绍PHP设计模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
六大原则
1.单一职责
2.里氏代换原则
3.依赖倒置原则
4.接口隔离原则
5.迪米特原则
设计模式分类
创建型模式: 工厂模式(简单工厂 工厂方法 抽象工厂)
结构型模式:适配器模式 门面模式 装饰器模式 注册树模式 代理模式 管道模式
行为型模式:策略模式 观察者模式 命令模式 迭代器模式
单例模式
定义:保证一个类只有一个实例,并提供一个访问它的全局访问点。
三私一共
class Singleton { //创建静态私有的变量保存该类对象 static private $instance; //防止使用new直接创建对象 private function __construct(){} //防止使用clone克隆对象 private function __clone(){} static public function getInstance() { //判断$instance是否是Singleton的对象,不是则创建 if (!self::$instance instanceof self) { self::$instance = new self(); } return self::$instance; } public function test() { echo "我是一个单例模式"; } } $sing = Singleton::getInstance(); $sing->test(); $sing2 = new Singleton(); //Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context in $sing3 = clone $sing; //Fatal error: Uncaught Error: Call to private Singleton::__clone() from context
简单工厂
使用场景:支付、数据库连接
缺点:扩展时违反开闭原则 需要改动类源码
DbMysql class { public function conn() { echo '链接mysql'; } } DbSqlite class { public function conn() { echo '链接Sqlite'; } } DbSql class { public statis function start($type) { swotch ($type) { case : 'mysql' return new DbMsql(); break; case : 'sqlite' return new BbSqlite() break; default : echo '没有此类' } } }
工厂方法模式
定义:工厂方法就是为了解决简单工厂扩展性的问题
接口类:interface 是为了规范调用类的方法必须与接口类方法一致
interface Db { public function conn(); } DbMysql class implements Db { public function conn() { echo '连接mysql'; } } DbSqlite class implements Db { public function conn() { echo '连接sqlite'; } } ==扩展== DbOracle class implements Db { public function conn() { echo '连接oracle'; } } ===================生产================ interface Factory { public static function createNew(); } mysqlFactory class implements Factory { public static function createNew() { return new DbMysql; }; } sqlliteFactory class implements Factory { public static function createNew() { return new DbSqlite; }; } ==扩展== oracleFactory class implements Factory { public static function createNew() { return new DbOracle; }; } ==========调用=========== //调用mysql $mysql = mysqlFactory::createNew(); $mysql->conn(); //调用sqlite $sqlite = sqliteFactory::createNew(); $sqlite ->conn(); //调用oracle $oracle = mysqlFactory::createNew(); $oracle->conn();
抽象工厂模式
定义:用来生产不同产品的组合
缺点:扩展性不好,对于新增无能为力
<?php interface Product { public function calculatePrice(): int; }// Product{} end class ShippableProduct implements Product { /* * @var float */ private $shippingCosts; public function __construct(int $productPrice, int $shippingCosts) { $this->productPrice = $productPrice; $this->shippingCosts = $shippingCosts; } public function calculatePrice(): int { return $this->productPrice + $this->shippingCosts; }// calculatePrice() end }// ShippableProduct{} end class DigitalProduct implements Product { /** * @var int */ private $price; public function __construct(int $price) { $this->price = $price; } public function calculatePrice(): int { return $this->price; }// calculatePrice() end }// DigitalProduct{} end class ProductFactory { const SHIPPING_COSTS = 50; public function createShippableProduct(int $price): Product { return new ShippableProduct($price, self::SHIPPING_COSTS); }// createShippableProduct() end public function createDigitalProduct(int $price): Product { return new DigitalProduct($price); }// createDigitalProduct() end }// ProductFactory{} end $factory = new ProductFactory(); $product = $factory->createDigitalProduct(150); print_r($product); /* DigitalProduct Object ( [price:DigitalProduct:private] => 150 ) */ $product = $factory->createShippableProduct(150); print_r($product); /* ShippableProduct Object ( [shippingCosts:ShippableProduct:private] => 50 [productPrice] => 150 )
适配器模式
定义:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间
类适配器使用的是继承:
/** * 目标角色 */ interface Target { /** * 源类也有的方法1 */ public function sampleMethod1(); /** * 源类没有的方法2 */ public function sampleMethod2(); } /** * 源角色 */ class Adaptee { /** * 源类含有的方法 */ public function sampleMethod1() { echo 'Adaptee sampleMethod1 <br />'; } } /** * 类适配器角色 */ class Adapter extends Adaptee implements Target { /** * 源类中没有sampleMethod2方法,在此补充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adapter = new Adapter(); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } }
对象适配器使用的是委派:
/** * 目标角色 */ interface Target { /** * 源类也有的方法1 */ public function sampleMethod1(); /** * 源类没有的方法2 */ public function sampleMethod2(); } /** * 源角色 */ class Adaptee { /** * 源类含有的方法 */ public function sampleMethod1() { echo 'Adaptee sampleMethod1 <br />'; } } /** * 类适配器角色 */ class Adapter implements Target { private $_adaptee; public function __construct(Adaptee $adaptee) { $this->_adaptee = $adaptee; } /** * 委派调用Adaptee的sampleMethod1方法 */ public function sampleMethod1() { $this->_adaptee->sampleMethod1(); } /** * 源类中没有sampleMethod2方法,在此补充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adaptee = new Adaptee(); $adapter = new Adapter($adaptee); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } }
这篇关于PHP设计模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享