PHP设计模式有哪些,你都了解多少?
Admin 2021-04-30 群英技术资讯 1789 次浏览
PHP设计模式有哪些?很多PHP新手可能对于PHP设计模式还不太了解,因此这篇文章就主要给大家介绍一下PHP设计模式,包括对单例模式、工厂模式、注册模式、适配器模式、策略模式、原型模式和观察者模式这七种模式的介绍,有需要的朋友可以看一下。
1、单例模式
一个类,只能允许有一个对象存在
<?php
class test{
protected function __construct(){
}
public static function getInstance(){
$_test = new test();
return $_test;
}
}
$test = test::getInstance();
var_dump($test);
?>
2、工厂模式
工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。
把对象的创建和使用的过程分开,比如: ClassA 调用 ClassB,那么 ClassA 只调用ClassB 的方法,至于实例化 ClassB 则在工厂内实现。这样既减少了代码的重复使用,也方便对 ClassB 的后期维护。如果 ClassB 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 ClassB 的方法即可,减少错误。
interface mysql{
public function connect();
}
class mysqli2 implements mysql{
public function connect(){
echo 'mysqli';
}
}
class pdo2 implements mysql{
public function connect(){
echo 'pdo';
}
}
class mysqlFactory{
static public function factory($class_name){
return new $class_name();
}
}
$obj = mysqlFactory::factory('pdo2');
$obj->connect();
3、注册模式
注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。
<?php
class Register
{
protected static $objects;
function set($alias,$object)//将对象注册到全局的树上
{
self::$objects[$alias]=$object;//将对象放到树上
}
static function get($name){
return self::$objects[$name];//获取某个注册到树上的对象
}
function _unset($alias)
{
unset(self::$objects[$alias]);//移除某个注册到树上的对象。
}
}
\Auto\Register::set('single',$single);
$single = \Auto\Register::get('single');
var_dump($single);
4、适配器模式
将一个类的接口转换成客户希望的另外一个接口。
//目标角色
interface Aims
{
public function newMethod1();
public function newMethod2();
}
//需要被适配的类(Adaptee)
Class Man
{
public function oldMethod1()
{
echo 'man';
}
public function oldMethod2()
{
echo '男人';
}
}
//需要被适配的类(Adaptee)
Class Woman
{
public function oldMethod1()
{
echo 'woman';
}
public function oldMethod2()
{
echo '女人';
}
}
//适配器,
Class Adapters implements Aims
{
private $adaptee;
public function __construct($adaptee)
{
$this->adaptee = $adaptee;
}
public function newMethod1()
{
//以少量的代码对被适配者作出适配
echo 'sex :';
$this->adaptee->oldMethod1();
}
public function newMethod2()
{
echo 'sex name :';
$this->adaptee->oldMethod2();
}
}
$adapter1 = new Adapters(new Man);
$adapter1->newMethod1();
$adapter2 = new Adapters(new Woman);
$adapter2->newMethod2();
5、策略模式
这是一个男人和女人的问题,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。
UserStrategy.php
<?php
/*
* 声明策略文件的接口,约定策略包含的行为。
*/
interface UserStrategy
{
function showAd();
function showCategory();
}
FemaleUser.php
<?php
class FemaleUser implements UserStrategy
{
function showAd(){
echo "2016冬季女装";
}
function showCategory(){
echo "女装";
}
}
MaleUser.php
<?php
class MaleUser implements UserStrategy
{
function showAd(){
echo "IPhone6s";
}
function showCategory(){
echo "电子产品";
}
}
Page.php//执行文件
<?php
require_once 'Loader.php';
class Page
{
protected $strategy;
function index(){
echo "AD";
$this->strategy->showAd();
echo "<br>";
echo "Category";
$this->strategy->showCategory();
echo "<br>";
}
function setStrategy(UserStrategy $strategy){
$this->strategy=$strategy;
}
}
$page = new Page();
if(isset($_GET['male'])){
$strategy = new MaleUser();
}else {
$strategy = new FemaleUser();
}
$page->setStrategy($strategy);
$page->index();
6、原型模式
不常用,大的对象类才使用,表现在clone
7、观察者模式
从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了
/**
* 事件产生类
* Class EventGenerator
*/
abstract class EventGenerator
{
private $ObServers = [];
//增加观察者
public function add(ObServer $ObServer)
{
$this->ObServers[] = $ObServer;
}
//事件通知
public function notify()
{
foreach ($this->ObServers as $ObServer) {
$ObServer->update();
}
}
}
/**
* 观察者接口类
* Interface ObServer
*/
interface ObServer
{
public function update($event_info = null);
}
/**
* 观察者1
*/
class ObServer1 implements ObServer
{
public function update($event_info = null)
{
echo "观察者1 收到执行通知 执行完毕!\n";
}
}
/**
* 观察者1
*/
class ObServer2 implements ObServer
{
public function update($event_info = null)
{
echo "观察者2 收到执行通知 执行完毕!\n";
}
}
/**
* 事件
* Class Event
*/
class Event extends EventGenerator
{
/**
* 触发事件
*/
public function trigger()
{
//通知观察者
$this->notify();
}
}
//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();
以上就是关于PHP设计模式及用法的介绍,希望对大家学习有帮助,想要了解更多PHP设计模式的内容大家可以继续关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了php 自定义函数实现将数据 以excel 表格形式导出,结合实例形式分析了PHP操作二维数组的遍历与Excel格式输出相关实现技巧,需要的朋友可以参考下
call_user_func官方的解释是:把第一个参数作为回调函数(callback),并且将其余的参数作为回调函数的参数。第一个参数可以是函数名,后面的均为作为该函数使用的参数。1.call_user_func的初步使用 看例子://1.初步使用functionsayHi($name){echo$name.'sayhi'."<br>";}
协程(Coroutine)也叫用户态 线程 ,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。协程是进程的补充,或者是互补关系。
swoole保持不掉线的方法:Swoole扩展可以通过心跳机制来保持不掉线,这个机制保证服务器和客户端之间连接的有效性。Swoole扩展本身内置了这种机制,开发者只需要配置一个参数即可启用。
目标了解swoole的http_server的使用,了解swoole的tcp服务开发,实际项目中问题如粘包处理、代理热更新、用户验证等。swoole与现有框架结合风格偏基础重代码环境PHP版本。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008