php 设计模式 总结 上

1 编程选择等宽字体

2 source code pro 字体

3 运行环境搭建,推荐 easyphp

4 关于命名空间:

面向对象的高级特性

介绍、使用:

namespace test1;

下面的所有代码都属于这个命名空间里面的。

调用:test1\funciton_name(); 即可。

5 类自动载入特性

function __autoload($class); // 以前是这么干的。

{

require __DIR__.‘/‘.$class.‘.php‘;

}

// 后来被废纸了, 5.3以后用 spl_autoload_register(‘autoload1‘);

这样就不冲突了,防止不同框架之间的冲突。自己随便定义自动载入函数。

6 基础框架:

psr-0规范

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

2 类名首字母大写

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

开发符合psr-0规范的基础框架

1 全部使用命名空间

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

3 单一入口

文件:

index.php

App 文件夹

imooc 文件夹

类名 文件名 命名空间 必须一致

注册 自动载入 类;include 包含进来。

7 数据结构

spl 数据结构   4种常用的数据结构

$stack = new splstack(); 栈定义

$stack->push(‘data1‘);// 入栈

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

队列

$queue = new splQueue();

$queue->enqueue(‘data1‘);

$queue->enqueue(‘data2‘);

echo $queue->dequeue();

$heap = new splMinHeap();//最小堆

$heap->insert(‘data1‘);//插入

echo $heap->extract();//提取

固定尺寸数组

$array = new splFixedArray(10);

$array[0] = 123;

$array[1] = 234;

var_dump($array);

8 链式操作

$db->where()->limit()->order();

class Database{

function where(){}

function order(){}

function limit(){}

}

传统:

$db->where();

$db->limit();

$db->order();

链式操作的核心就是:每个方法后,return $this;

class Database{

function where(){return $this;}

function order(){return $this;}

function limit(){return $this;}

}

9 魔术方法的使用

1 __get/__set 对象属性接管

2 __call/__callStatic  方法/静态方法 调用

3 __toString // 转换字符串

4 __invoke // 当成函数执行

对于对象不存在的属性的时候自动执行

class Object{

function __set($key,$value){

$this->array[$key] = $value;

}

function __get($key){

return $this->array($key);

}

}

对于对象不存在的方法的时候自动执行

class Object{

function __call($func,$param){

return ‘magic function \n‘;

}

// 类的静态方法

static function __callStatic($func,$param){

return ‘magic static function \n‘;

}

// echo $obj; 把类当作字符串用

function __toString(){

return __CLASS__;

}

//echo $obj($param); 把类当函数用

function __invoke($param){

return ‘invoke‘;

}

}

10 基础设计模式

3种基本设计模式

工厂模式、单立模式、注册模式

工厂方法或类生成对象,而不是在代码中直接new

单例模式:使某个类的对象仅允许创建一个

注册模式:全局共享和交换对象。

工厂模式:工厂方法替换new 操作

class Factory{

static function createDatebase(){

$db = new Database();

return $db;

}

}

$db = IMooc\Factory::createDatabase();

方便统一修改变化;

单列模式: 防止资源浪费,一次创建

class Database

{

private $db;

private function __construct() //创建私有

{

}

static function getInstance()

{

if(self::$db){

return self::$db;

}else{

self::$db = new self();

return self::$db;

}

}

}

注册模式:

class Register{

protected static $objects;

function set($alias,$object){

self::$objects[$alias] = $object;

}

function get($name){

return self::$objects[$name];

}

function _unset($alias){

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

}

}

用法:$db = Register::get(‘db1‘);

适配器模式:

1 适配器模式,可以将截然不同的函数接口封装成统一的API

2 实际应用举例,php的数据库操作有mysql,mysqli,pdo3种模式,可以统一成益智的接口

class mysql {}

class mysqli {}

class pdo{}

<?php

namespace IMooc;

interface IDatabase

{

function connet($host,$user,$passwd,$dbname);

function query($sql);

function close();

}

class Datebase{

}

mysql.php

<?php

namespace IMooc;

use IMooc\IDatabase;

class MySQL [implements] IDatabase{  [implements]  貌似需要替换

protected $conn;

function connect($host,$user,$passwd,$dbname){

$conn = mysql_connect($host,$user,$passwd);

mysql_select_db($dbname);

$this->conn = $conn;

}

function query($sql){

$res = mysql_query($sql);

return $res;

}

function close(){

}

}

// 使用

$db = new IMooc\Databes\MySQL();

$db->connect(‘127.0.0.1‘,‘root‘,‘passwd‘,‘dbname‘);

$db->query($sql);

1首先约定接口,

2实现接口的所有方法

策略模式

1 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式

2 实际应用举例,假如一个电商网站系统,针对男性女性显示不同。

增加策略即可:

实现和使用

接口文件

UserStrategey.php

<?php

namespace IMooc;

interface UserStrategy{

function showAd();

function showCategory();

}

策略实现文件

femalUserStrategy.php

<?php

namespace IMooc;

class FemalUserStrategy implemets UserStragey{

function showAd(){

echo ‘男性广告‘;

}

function showCategory(){

echo ‘男人‘;

}

}

// 女性同上

// 使用文件 index.php

<?php

class Page{

protected $strategy;

function index(){

if(isset($_GET[‘female‘])){

// 男性逻辑

}

// 传统如上

// 策略模式如下

echo "AD:";

$this->strategy->showAd();

}

function setStragegy(\IMooc\UserStrategy $strategy){

$this->strategy = $strategy;

}

}

$page = new Page;

if(isset($_GET[‘female‘])){

$strategy = new \IMooc\FemalUserStrategy();

}else{

$strategy = new \IMooc\MaleUserStrategy();

}

$page->setStrategy($strategy);

$page->index();

策略模式的控制反转、依赖导致

面向对象的解耦。很重要。

数据对象映射模式

1 数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据的操作

时间: 2025-01-08 08:16:38

php 设计模式 总结 上的相关文章

朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设计模式你会发现很多平时写代码的套路和OO的套路和设计模式里总结的类似,这也说明了你悟到的东西和别人悟到的一样,经过大量实践总能趋向性得出一些最佳实践的结论.架构设计也是一样,这里结合自己的理解分析一下微软给出的云架构的一些模式.话说微软干这方面的事情真的很厉害,之前翻译过的<微软应用架构指南>写的

设计模式-观察者模式(上)&lt;转&gt;

本文参考Head First设计模式一书,感觉书中的例子实在很好,很贴切.对模式的知识点进行总结,并对书的源码做了一定注释. 观察者模式要点有二:主题和观察者. 最贴切的案例是:杂志订阅,杂志是主题,观察者是订阅者.当出版新杂志时候,这个事件会自动通知所有的订阅者. 根据OO基本原则,应该针对接口编程(当然原因很多),主题和订阅者一般都作为接口. 下面是Head First的例子,是一个气象站,用户订阅气象信息的服务. 并且,最终用户所要的信息可能是: 针对这个需求,应用观察者模式来实现: 但是

java之Spring(AOP)前奏-动态代理设计模式(上)

我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A: 过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面:又过 了几天天,项目经理说这两个新加的功能顺序需要调换一下,然后你找到一个礼拜之前的写的源代码,看了 一遍想起来当时是怎么实现的了,这部分是功能A,那部分是功能B,然后巴拉巴拉换了顺序.看到这是不是 觉得很烦,动不动就要在源码上加新功能,完了又要在源码上换新功能的顺序,那么一大坨源码,还好是自 己写的源码,理

创建型设计模式(上)

单例模式: 1.定义:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类 2.实现过程要点: (1)单例类的构造函数为私有 (2)提供一个自身的静态私有成员变量 (3)提供一个公有的静态工厂方法 3.优点: (1)提供了对唯一实例的受控访问 (2)由于在系统内存中只存在一个对象,因此可以节约系统资源 (3)允许可变数目的实例.我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例 4.缺点: (1)单例模式中没有抽象层,因此单例类的

结构型设计模式(上)

适配器模式: 类适配器: 对象适配器:  1.定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作 2.模型结构: (1)目标抽象类(Target):客户所期待得到的接口 (2)适配器类(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口 (3)适配者类(Adaptee):需要适配的类 3.优点: (1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码 (2)增加了类的透明性和复用性,将具体的实现封装在适配者

如何学习设计模式

GoF的[设计模式]是经典著作,有人看了好多遍仍然说没有看懂,许多人看懂了一些模式但不知道如何应用--这里,yqj2065抛砖引玉,讨论一下如何学习设计模式. ①    学习技巧 学习设计模式时,有一些技巧能够帮助你快速理解设计模式. a)        使用较简单的面向对象的语言如Java.C#.GoF的[设计模式]实质上是面向对象的设计模式.[GoF·1.1]中提到"程序设计语言的选择非常重要,它将影响人们理解问题的出发点".从学习设计模式的角度看,Java和C#较C++更容易一些

对设计模式的理解

学习java设计模式有段时间了,一直在阅读学习<深入浅出设计模式>,本文就简单说下本人对于设计模式的浅显理解. 我理解的设计模式是一些框架,经过前辈们的实践与时间的考验沉淀下来的一种代码设计框架.在项目开始之前,良好的软件架构与代码设计对后面的项目实现开发效率的促进,维护成本的提高都有很大的益处.一个未经考虑的代码设计在后期的维护过程中会增加大量的成本,工程师需要大量的时间去理解源码的结构,修补因为解耦性差导致复杂度超高的bug.在前辈们的努力下,无数经过时间检验的优秀软件架构产生了,而且很多

【设计模式】模板模式

引子 这是一个很简单的模式,却被非常广泛的使用. 之所以简单是因为在这个模式中仅仅使用到了继承关系. 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子. “使用委派关系代替继承关系”, “尽量使用接口实现而不是抽象类继承”等等专家警告,让我们大家对继承“另眼相看”. 其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了. 合理的利用继承关系,还是能对你的系统设计起到很好的作用的. 而模板方法模式就是其中的一个使用范例. 定义与结构 模板方法(Template Method)

小话设计模式之设计心得

经常看到各个论坛经常有人讨论设计模式,进去一看,基本都是造搬一些设计模式书上的例子.看完之后,往往有一个疑问,他们写完之后在实际工作到底能不能用上呢? 今天闲着无聊,说说自己工作上使用过的心得.欢迎拍砖! 首先,设计模式到底是什么东西? (本来想留最后写,写完发现不知道怎么写了,就不写了) 使用设计模式到底为了什么? (本来想留最后写,写完发现不知道怎么写了,就不写了) 怎么把设计模式应用到工作中去? 这个我觉得最重要的,犹想当年刚开始学习设计模式时,把一本几百页的书看完,里面提到的30左右个设