https://blog.csdn.net/self_realian/article/details/78228733

掌握PHP各类设计模式,具备设计纯面向对象框架和系统能力是非常有必要的。给大家一个小建议吧,学习设计模式的时候,使用phpStorm工具,因为设计模式是纯面向对象的,有很多的类,phpStorm 这个IDE工具有很多的快捷方式能帮助你快速找到对应的类。那么废话少数说,下面进入正题吧。

一、面向对象的高级特性

1,命名空间

最早的PHP是没有命名空间的,所有的代码都是在同一个命名空间下,这样就不能重载相同的类或函数,随着我们项目的工程越来越大,文件越来越多,这个时候产生命名冲突就会越来越多,代码也会越来越复杂。到PHP5.3的时候,出现了命名空间。规定所有命名空间放在文件的开头位置(关于命名空间的具体语法及使用这里就不说了,大家自行去学习。本篇博客主要说的是设计模式)

2,类自动载入

最早的时候我们载入类都是通过include或者require来实现,当PHP项目变大之后,载入的文件越来越多,那如果一个文件要依赖几十个类文件,那就要在这个文件的前边写几十个require,这样会给开发带来不便。通过自动载入就能很方便的载入我们需要的类(自动载入的知识也需要大家自己去学习)

前边我们提了命名空间和类自动载入,那么现在我们就用这两个知识来搭一个PHP面向对象的基础框架。首先我们来说一下PSR-0这个规范(PHP面向对象编码规范)。这个规范有三项约定

1,PHP的命名空间必须与绝对路径一致

2,类名的首字母必须大写

3,除了入口文件之外,其它“.php”必须只有一个类,不能有其它的可执行的代码

开发一个符合PSR-0规范的基础框架

1,全部使用命名空间

2,所有PHP文件必须自动载入,不能有include/require

3,单一入口文件

PSR-0规范框架代码

首先我给我的目录先截一下图

index.php

<?php

//入口文件

define('BASEDIR', __DIR__);//整个框架的根目录

include BASEDIR.'/Shulv/Loader.php';

spl_autoload_register('\\Shulv\\Loader::autoload');

Shulv\Object::test();

App\Controller\Home\Index::test();

Object.php

<?php

namespace Shulv;

class Object

{

static function test(){

echo "test()"."<br />";

}

}

//不能再有任何其它可执行的代码

Loader.php

<?php

namespace Shulv;

class Loader{

static function autoload($class){

require BASEDIR.'/'.str_replace('\\', '/', $class).'.php';

}

}

Index.php

<?php

namespace App\Controller\Home;

class Index{

static function test(){

echo __METHOD__;

}

}

这里主要学的是思想,框架代码是很简单的。

3,SPL标准库简介(PHP标准库)

SPL中提供了很多常用数据结构的一些封装,具体的可以去php的官方网站(www.php.net/spl)来查看有关SPL的一些东西。

//比如栈结构(先进后出)

$stack = new SplStack();//栈主要有两种接口,就是进(push())和出(pop())

$stack->push("data1\n");//入栈

$stack->push("data2\n");//入栈

echo $stack->pop();//出栈

echo $stack->pop();//出栈

输出结果:

data2

data1

//队列结构

$queue = new SplQueue();//队列是先进先出

$queue->enqueue("data1\n");//入队列

$queue->enqueue("data2\n");//入队列

echo $queue->dequeue();//出队列

echo $queue->dequeue();//出队列

输出结果:

data1

data2

//堆结构

$heap = new SplMinHeap();

$heap->insert("data1\n");//将数据插入到堆

$heap->insert("data2\n");//将数据插入到堆

echo $heap->extract();//从堆中取出数据

echo $heap->extract();

运行结果

data1

data2

本篇博客主要是讲集中基础的设计模式:

1,工厂模式

2,单例模式

3,注册模式

一,工厂模式

我们可以设计出来一个工厂(其实就是类),该工厂的作用就是为我们生产各种对象。这种工厂通常只要指定类名,就可以据此获取

<?php

namespace Shulv;

class Factory{

//Instance表示“实例”,也就是指“对象”

static function getInstance($className){//将要实例化的类名传递过来

if(file_exists('./'.$className.'.class.php')){

$obj1 = new $className();

return $obj1;

}else{

return 'not exist';

}

}

}

二,单例模式

对于某些类,在使用它的时候,从头到尾(从程序的开始到结束),都只需要一个对象,就可以完成所有的人物

* 单例:

* 某个类只允许创建出一个对象,即使去创建多次,也只能得到一个对象(就比如创建一个连接数据库的对象,前前后后只要创建一个就行)

//实现一个单例类:其只能获得一个对象

class B{

private static $instance;//定义成私有,那么它只能在本类中使用。定义成静态就能通过类名来访问了

private function __construct(){}//定义成私有,也就是不让别人在类外new 出对象,这样就只能通过getNew()获取对象

public static function getNew(){

//如果本类中的$instance还没有数据

if(!isset(B::$instance)){

B::$instance = new self;

}

return B::$instance;

}

private function __clone()

{

}

}

$o1 = B::getNew();

$o2 = B::getNew();

//我们会发现这创建的还是一个类(资源标识符相同)

//var_dump($o1,$o2);

//下面我们再看一下一个特殊情况

$o3 = clone $o1;//克隆对象(当我把那个__clone()方法定义成私有,这句就会报错)

var_dump($o1,$o2,$o3);//这个时候我们会发现$o3是一个新对象了   这个时候又不符合单例了(注意:这个clone算运算符)

/*

*本来一个类中有一个隐藏的public function __clone()方法,那我们如果想实现单例,我们给它定义成私有就行,不让他在类外使用

*/

三,注册模式

全局共享和交换对象

<?php

namespace Shulv;

/*

注册模式就是用来将一些对象注册到我们的全局事物上边,那就可以在任意位置访问

*/

class Register{

protected static $objects;

function set($alias, $object){//表示将一个对象注册到全局的注册树上

self::$objects[$alias] = $object;//第一个参数表示取的别名

}

function _unset($alias){//注意:这个_unset()不是魔术方法,魔术方法那个是__unset()(两个下划线)

//表示从树上移除

unset(self::$objects[$alias]);

}

function get($name){

return self::$objects[$alias];

}

}

//当我们在工厂模式中获得对象之后,再将获得的对象映射到全局树上,那么工厂模式就只用构造一次

Register::set('A',$a);//A是别名(加在工厂模式中)

PHP之设计模式的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. 拼凑sql语句另外一个方法

    经常拼凑sql语句,经常是手工拼写 也可以利用字典另外一个模式拼凑 这里采用的是Dictionary中的Aggregate方法. 代码如下: static void Main(string[] arg ...

  2. mysql数据库,什么是数据库的全备份?

    需求描述: 今天要做mysql数据库的全备份,那么就要弄清楚一个概念,到底什么是数据库的全备份呢. 概念解释: 数据库的全备份,就是在一个给定的时间点,对于mysql服务器管理的所有的数据进行备份. ...

  3. Makefile--隐含规则自动推dao(一)

    [版权声明:转载请保留出处:周学伟:http://www.cnblogs.com/zxouxuewei/] 上一节的Makefile勉强可用,但还写的比较繁琐,不够简洁.对每一个.c源文件,都需要写一 ...

  4. 立即调用的函数表达式---IIFE

    有些人则称为“自执行的匿名函数” 在闭包中,我们经常需要使用到匿名函数,我感觉闭包就是一种匿名函数,子集. 但是直接在匿名函数后面调用函数是会出错的.比如: function () { alert(& ...

  5. c# T obj = default(T);

    泛型类和泛型方法同时具备可重用性.类型安全和效率,这是非泛型类和非泛型方法无法具备的.泛型通常用在集合和在集合上运行的方法中..NET Framework 2.0 版类库提供一个新的命名空间 Syst ...

  6. python常用BIF汇总

    append():在列表末尾增加一个数据项:例如a.append('hello') pop():用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值:例如a.pop() extend(): ...

  7. apache编译安装完成后的服务启动设置

    Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止.本例中apache安装在/usr/local/apache-2.2.6,服务控制脚本为: /usr/loc ...

  8. linux系统socket通信编程2

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  9. C++中的枚举变量

    至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量).根据上面对enum类型的描述,有以下 ...

  10. 为什么使用eval()将json字符串转换为对象要多加一个小括号

    使用eval()将json字符串转换为对象要多加一个小括号: 关于eval()函数的具体用法这里就不多介绍了,具体可以参阅javascript的eval()方法一章节,下面就介绍一下为什么使用eval ...