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)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
随机推荐
- Kubernetes 系列(四):使用Traefik访问.net core api
一. 准备 本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k ...
- httpd2.2
httpd -t:检查httpd配置文件/etc/httpd/conf/httpd.conf的语法错误 请求报文语法 <method> <request-URL> <ve ...
- 初次接触python时,整理的一些基础操作
1.window下python简单使用 (1).使用工具网址 https://jingyan.baidu.com/article/9f7e7ec0ec2e676f2915545f.html (2).各 ...
- Go中使用seed得到相同随机数的问题
1. 重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象. func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now( ...
- MyBatis resultType用Map 返回值中有NULL则缺少字段 返回值全NULL则map为null
这个问题我大概花了2个小时才找到结果 总共需要2个设置 这里是对应springboot中的配置写法 @select("select sum(a) a,sum(b) b from XXX wh ...
- Dubbo学习系列之十五(Seata分布式事务方案TCC模式)
上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...
- Linux配置python
文章出处 https://www.cnblogs.com/yhongji/p/9383857.html 我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本 ...
- python编程基础之三十八
正则表达式:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 需要引入内置模块r ...
- Cocos2d-x入门之旅[1]场景
在游戏开发过程中,你可能需要一个主菜单,几个关卡和一个END的界面,如何组织管理这些东西呢? 和其他游戏引擎类似,Cocos也使用了场景(Scene) 这个概念 试想象一部电影或是番剧,你不难发现它是 ...
- 创建SSM项目所需
一.mybatis所需: 1.相关jar包 2.创数据库+Javabean类 3.接口+写SQL的xml映射文件 4.核心配置文件:SqlMapConfig.xml 二.springMVC所需: 1. ...