PHP经典设计模式

<?php
/**
* 单例模式
*/
class Site
{
#定义属性
public $siteName;
#定义本类的静态实例
protected static $instance=null;
#禁用构造方法
private function __construct($siteName)
{
#初始化$siteName属性
$this->siteName=$siteName;
}
#获取本类的唯一实例
public static function getInstance($siteName="我是本类的唯一实例")
{
#检测$instance属性是否属于本类
if (!self::$instance instanceof self){
self::$instance=new self($siteName);
}
return self::$instance;
}
}
/**
*用工厂模式生成本类的单一实例
*/
class Factory
{
#创建指定类的实例
public static function create()
{
return Site::getInstance("我是传入的字符");
}
}
/**
* 对象注册树,注册模式
* 1、注册:set(),把对象放树上
* 2、获取:get(),把对象取下来使用
* 3、注销:_unset(),把对象注销
*/
class Register
{
#创建对象池,数组存储
protected static $objects=[];
#生成对象并挂树上
public static function set($alias,$object)
{
self::$objects[$alias]=$object;
}
#从树上取下对象
public static function get($alias)
{
return self::$objects[$alias];
}
#把对象从树上注销
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
#将Site类的实例挂树上去,放到对象池
Register::set('site',Factory::create());
#从树上取下对象
$obj=Register::get('site');
#查看一下该对象
var_dump($obj);
echo"<hr>";
echo $obj->siteName;
?>

运行结果

Trait类的复用

<?php
/**
* Trait实现了代码的复用
* 并且突破了单继承的限制
* Trait似类非类,不能实例化
*/
trait Demo1
{
public function hello()
{
return __METHOD__;
}
}
trait Demo2
{
public function hello()
{
return __METHOD__;
}
}
class Test
{
public function hello()
{
return __METHOD__;
}
} class Demo extends Test
{
#使用use关键字声明trait,方法同名优先级:本类、trait、父类
#Demo1的hello1方法替代Demo2的hello方法
use Demo1,demo2{
Demo1::hello insteadof Demo2;
Demo2::hello as Demo2Hello;
}
public function hello()
{
return __METHOD__;
}
#通过trait使用
public function test1()
{
#Demo1中的方法
return $this->hello();
}
public function test2()
{
return $this->Demo2Hello();
}
}
$obj=new Demo();
echo $obj->hello();
echo "<hr>";
echo $obj->test1();
?>

  运行结果

当trait里的方法和本类以及父类同名时的优先级:当前类方法 > trait 的方法 > 父类的方法

php经典设计模式和Trait类代码的复用的更多相关文章

  1. Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. 23种经典设计模式UML类图汇总

    在这里23种经典设计模式UML类图汇总       创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...

  3. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  4. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  5. ThinkPHP设计模式与Trait技术

    阅读原文 设计模式 单例模式 class Site { //属性 public $siteName; //本类的静态实例 protected static $instance = null; //禁用 ...

  6. Java经典设计模式之十一种行为型模式

    转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...

  7. Java经典设计模式之七大结构型模式

    转载: Java经典设计模式之七大结构型模式 博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以 ...

  8. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  9. Java经典设计模式 总览

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

随机推荐

  1. 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)

    以下是运满满K8s容器化进程记录,摘抄一下,方便以后查阅. 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上, ...

  2. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(下)注解配置,统一错误处理和拦截器

    我们上次大致说完了执行流程,也只是说了大致的过程,还有中间会出错的情况我们来处理一下. 统一异常处理 比如我们的运行时异常的500错误.我们来自定义一个类 package com.springmvcb ...

  3. 系统定时任务crond

    1.Linux的定时任务:crond(crontab)服务 (1)crond 是什么? crond 是 linux 系统中用来定期执行命令或者指定程序任务的一种服务和软件:crond 服务默认情况(每 ...

  4. 前端get和post那些事

    首先,简单介绍下,get和post请求方法,综合以往笔记,现整理如下: 一.HTTP请求比较: 两种在客户端和服务器端进行请求-响应的方法是:GET和POST. GET - 从指定的资源请求数据 PO ...

  5. maven web项目下mybatis generator的使用

    idea中新建maven web项目,完善java,resources目录: pom.xml中添加jdbc依赖,mybatis generator的依赖和插件: <dependencies> ...

  6. 纯C语言写的按键驱动,将按键逻辑与按键处理事件分离~

    button drive 杰杰自己写的一个按键驱动,支持单双击.连按.长按:采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键. 源码地址:h ...

  7. .net core运用application/x-www-form-urlencoded发起post请求

    通常情况下都是使用 application/json发起post请求,但是有的.net 接口只接收 application/x-www-form-urlencoded 例如: { name:" ...

  8. 快速入门Maven(二)(Eclipse构建Maven项目)

    Mars2的eclipse()已经集成了Maven插件,所以用这个版本不需要装插件了. 接下来构建: 一.调整Eclipse设置 1.选择3.3.9版本的maven软件 2.修改默认的本地仓库地址 二 ...

  9. django自带cache结合redis创建永久缓存

    0916自我总结 django自带cache结合redis创建永久缓存 1.redis库 1.安装redis与可视化操作工具 1.安装redis https://www.runoob.com/redi ...

  10. 微信小程序发起请求

    一.示例代码 wx.request({ url: 'test.php', // 仅为示例,并非真实的接口地址 data: { x: '', y: '' }, header: { 'content-ty ...