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)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
随机推荐
- 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统
前言 今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么 首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...
- Scala 学习笔记之集合(8) Try和Future
import util._ import concurrent.ExecutionContext.Implicits.global import concurrent.Future import co ...
- JVM类加载过程与双亲委派模型
类加载过程 类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终形成被JVM直接使用的Java类型.包含: 加载:获取该类的二进制字节流,将字节流代表的静态存储 ...
- display——table-cell属性
display的table和table-cell一般情况下用的不多,所以很少有人去关注它,但他们两个联手起来会给你惊喜! 当两个或者两个以上标签一起使用显示在同一行时,以前常用的是float.posi ...
- 算法学习之剑指offer(一)
题目一: 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路1:遍历 ...
- java中的静态
static静态 public static void main 类只是用来存储和被调用的,而对象是需要执行的,执行时就必定需要知道程序的入口,这个入口就是由main所在的位置. Java的类中没有m ...
- postman环境变量设置
1.点击小齿轮进入到环境变量添加页面,点击add添加环境变量 2.输入变量名称和变量值 3.添加成功 4.接口中设置变量
- “零基础”如何快速掌握web前端核心技术?
前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,今天想强调一下,学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联 ...
- Zabbix 2.2系列注入+getsehll
Zabbix 是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com Zabbix 的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻 ...
- C++ 利用template给函数中的变量赋初值
#include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...