php经典设计模式和Trait类代码的复用
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类代码的复用的更多相关文章
- Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 23种经典设计模式UML类图汇总
在这里23种经典设计模式UML类图汇总 创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...
- Java经典设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...
- Java经典设计模式之七大结构型模式(附实例和详解)
博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...
- ThinkPHP设计模式与Trait技术
阅读原文 设计模式 单例模式 class Site { //属性 public $siteName; //本类的静态实例 protected static $instance = null; //禁用 ...
- Java经典设计模式之十一种行为型模式
转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...
- Java经典设计模式之七大结构型模式
转载: Java经典设计模式之七大结构型模式 博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以 ...
- Java经典设计模式之五大创建型模式
转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...
- Java经典设计模式 总览
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
随机推荐
- python使用代理ip
python使用代理的方法有两种 1. #先创建代理ip对象 proxy_support = urllib.request.ProxyHandler({'https':'117.64.149.137: ...
- 常用Form表单正则表达式
前端常用form表单提交,校验正则表达式奉上!/** * 邮箱 * @param {*} s */ export function isEmail (s) { return /^([a-zA-Z0-9 ...
- IDEA 学习笔记之 Java项目开发深入学习(2)
Java项目开发深入学习(2): 查找变量被用到的地方 编译当前文件 增加变量watch 注意:我使用了keymap (eclipse模板),所以很多快捷键和eclipse一样. F5单步调试进入函数 ...
- Spark 学习笔记之 MONGODB SPARK CONNECTOR 插入性能测试
MONGODB SPARK CONNECTOR 测试数据量: 测试结果: 116万数据通过4个表的join,从SQL Server查出,耗时1分多.MongoSparkConnector插入平均耗时: ...
- ActiveMQ学习总结------实战操作(上)02
相信大家通过上一篇博文已经对ActiveMQ有了一个大致的概念了, 那么本篇博文将带领大家一步一步去实战操作我们的ActiveMQ 本篇主要内容: 1.ActiveMQ术语及API介绍 2.Activ ...
- 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?
线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间. 一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现.同上一个问题,线程调度并不受到 Java 虚拟 ...
- ASP.NET Web API 2系列(一):初识Web API及手动搭建基本框架
1.导言 随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数.全栈工程师的压力越来越大. PC端,pad端,移动端App(安卓/IOS)的发展,使得前后端一体的开发模式十分笨重.因此,前后端 ...
- 分库分表(4) ---SpringBoot + ShardingSphere 实现分表
分库分表(4)--- ShardingSphere实现分表 有关分库分表前面写了三篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3.分库 ...
- mapper插入时显示中文
可能是jdbc url需要加characterEncoding=utf-8,例 jdbc:mysql://localhost:3306/smbms?characterEncoding=utf8
- drf框架接口文档
drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...