php设计模式是什么,该如何理解

 更新时间:2016年11月25日 14:58  点击:2038
做程序开发的朋友应该都听说过设计模式这个词,对于做java开发的,应该一听到这个词就明白是什么意思,但对于做PHP的朋友来说,往往越看越迷糊,那到底什么是设计模式呢?其实作者也不懂,下面是从网上摘抄的关于设计模式的一些解释,期待能够有一些理解。

 


php设计模式有如下

备忘录模式(Memento模式)

观察者模式(Observer模式)

模板方法模式(Template Method模式)

命令模式(command模式)

合成模式(composite模式)

享元模式(flyweight模式)

策略模式(strategy模式)

状态模式(state模式)

适配器模式(adapter模式)

工厂方法模式(factory method模式)

原型模式(prototype模式)

门面模式(facade模式)

单例模式(singleton模式)

桥梁模式(bridge模式)

装饰器模式(decorator模式)

抽象工厂模式(abstract factory模式)

建造者模式(Builder模式)

访问者模式(Visitor模式)


当你在不断的试图从你的应用程序中发现新的特征时,你是否发现你提出的解决方法和一些以前你已经实现的东西是如此的类似呢?如果你是一个程序员(即使你才开始很短的时间),你都可能回答“是”。这看起来就是你使用了一些以前的代码来解决软件开发过程中新发现的问题了。你可能已经认识到:你的解决方法是基本原理,是一个不仅仅是你而且是所有专业开发者都能广泛重复应用的方法。

事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来。设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板。

设计模式历史

“设计模式”这个术语最初被设计用于建筑学领域。Christopher Alexander 在他1977的著作“A Pattern Language:Towns/Building/Construction”里面描述了一些常见的建筑学设计问题,并解释了如何用这些已有的,著名的模式集合来开始全新的有效的设计。Alexander的观点被很好的转化到软件开发上来,并且长期的用原有的组件来构造新的解决方案。

所有的设计模式都有一些常用的特性:一个标识(a name),一个问题陈述(a problem statement)和一个解决方案(a solution)。

1、一个设计模式的标识是重要的,因为它会让其他的程序员不用进行太深入的学习就能立刻理解你的代码的目的(至少通过这个标识程序员会很熟悉这个模式)。

2、问题描述是用来说明这个模式的应用的领域。

3、解决方案描述了这个模型的执行。一个好的设计模式的论述应该覆盖使用这个模型的优点和缺点。

一个模式是解决特定问题的有效方法。一个设计模式不是一个库(能在你的项目中直接包含和使用的代码库)而是一个用来组织你的代码的模板。事实上,一个代码库和一个设计模式在应用上是有很多不同的。

比如,你从店铺里面买的一件衬衫是一个代码库,它的颜色,样式和大小都由设计师和厂商决定,但它满足了你的需求。然而,如果店里面没有什么衣服适合你,那你就能自己创建自己的衬衫(设计它的形状,选择布料,然后裁缝在一起)。但是如果你不是一个裁缝,你可能会发现自己很容易的去找一个合适的模式然后按着这个模式去设计自己的衬衫。使用一个模型,你可以在更少的时间内得到一个熟练设计的衬衫。

回到讨论软件上来,一个数据提取层或者一个CMS(content management system)就是一个库,它是先前设计好而且已经编码好了的,如果它能准确的满足你的需要那它就是一个好的选择。

 

工厂模式

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。

 代码如下 复制代码

Example #1 调用工厂方法(带参数)
<?php
class Example
{
    // The parameterized factory method
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Driver not found');
        }
    }
}
?>

按上面的方式可以动态加载drivers。如果Example类是一个数据库抽象类,那么 可以这样来生成MySQL和 SQLite驱动对象:
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');

// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
单例

单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。

Example #2 单例模式
<?php
class Example
{
    // 保存类实例在此属性中
    private static $instance;
   
       // 构造方法声明为private,防止直接创建对象
    private function __construct()
    {
        echo 'I am constructed';
    }

    // singleton 方法
    public static function singleton()
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }
   
    // Example类中的普通方法
    public function bark()
    {
        echo 'Woof!';
    }

    // 阻止用户复制对象实例
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }

}

?>

这样我们可以得到一个独一无二的Example类的对象。
<?php

// 这个写法会出错,因为构造方法被声明为private
$test = new Example;

// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->bark();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;

?>

最后一个想法:就象一个裁缝模型,一个设计本身而言是没有什么用处的。毕竟,你不可能穿一个服装模型,它仅仅是由很薄的纸拼凑起来的。类似的,一个软件设计模型也仅仅只是一个引导。它必须根据程序设计语言和你的应用程序的特点和要求而特别的设计。

在这里我们可以利用strtotime函数与date函数同时使用来获取了,例子非常的简单在此我就不介绍其它的了,直接上代码。

PHP获得今天凌晨时间戳,百度了一下,没看见有,也可能是我理解错了。

直接上代码:

比如,今天是2102年11月2号,那么php要获取2102年11月2号的时间戳是怎么办的呢?

代码:echo strtotime(date('Y-m-d')),'

';


获取明天凌晨的时间戳

代码:echo strtotime(date('Y-m-d',strtotime('+1 day'))),'

';

最后再附一串代码

<?php
echo "今天:".date("Y-m-d")."<br>";    
echo "昨天:".date("Y-m-d",strtotime("-1 day")), "<br>";    
echo "明天:".date("Y-m-d",strtotime("+1 day")). "<br>"; 
echo "一周后:".date("Y-m-d",strtotime("+1 week")). "<br>";    
echo "一周零两天四小时两秒后:".date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")). "<br>";    
echo "下个星期四:".date("Y-m-d",strtotime("next Thursday")). "<br>";    
echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>";    
echo "一个月前:".date("Y-m-d",strtotime("last month"))."<br>";    
echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>";    
echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";   
strtotime()函数的作用是将日期时间描述解析为 Unix 时间戳
int strtotime  ( string time [, int now] )
?>

在php网站开发过程中有时候需要把结果集进行分组,使用php的内置函数array_chunk就可以实现
 代码如下 复制代码

<?php
$teams=array(1,2,3,4,5,6,7,8,9);
$teams=array_chunk($teams,2);
print_r($teams);
/*

Array

(

    
[0] => Array

        
(

            
[0] => 1

            
[1] => 2

        
)

 
    
[1] => Array

        
(

            
[0] => 3

            
[1] => 4

        
)

 
    
[2] => Array

        
(

            
[0] => 5

            
[1] => 6

        
)

 
    
[3] => Array

        
(

            
[0] => 7

            
[1] => 8

        
)

 
    
[4] => Array

        
(

            
[0] => 9

        
)

 
)

*/

?>

array_chunk() 函数把一个数组分割为新的数组块。
其中每个数组的单元数目由 size 参数决定。最后一个数组的单元数目可能会少几个。
可选参数 preserve_key 是一个布尔值,它指定新数组的元素是否有和原数组相同的键(用于关联数组),还是从 0 开始的新数字键(用于索引数组)。默认是分配新的键。

我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作。而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑

待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名。


思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了。


原型(Prototype)模式示例:

 代码如下 复制代码

<?php

//机兵类

class Marine

{

  //所属的用户ID

  public $playerID

  //构造函数,参数为用户的id

  public function __construct($id)

  {

  $this->playerID = $id;

  }

}

//兵种的管理类

class TroopManager

{

  //数组,用于存放多个兵种的原型

  public $troopPrototype = array();

  //增加原型,第一个参数为原型的名字,第二个参数为原型对象

  public function addPrototype($name, $prototype)

  {

    $this->troopPrototype[$name] = $prototype;

  }

  //获取原型的克隆,也就是替代new的方法,参数为原型的名字

  public function getPrototype($name)

  {

    return clone $this->troopPrototype[$name];

  }

}

//初始化兵种的管理类

$manager = new TroopManager();

//初始化两个属于不同玩家的机兵的原型

$m1 = new Marine(1);

$m2 = new Marine(2);

//增加原型,同时用比较容易记忆的名字来命名原型

$manager->addPrototype('Marine of 1', $m1);

$manager->addPrototype('Marine of 2', $m2);

//当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作

$m3 = $manager->getPrototype('Marine of 1');

?>

用途总结:原型模式可以将新增对象的工作细节封装。


实现总结:需要一个原型管理类,实现增加和获取克隆原型的方法。注意这里由于为了简明,省略了一些东西,实际上我们可以在克隆方法上做一些改动,也可以用接口规范每个原型类。

Memcache是php中常用到的一个高性能的分布式的内存对象缓存系统,我们可以利用它来对网站进行性能提高并且减少服务器负载,下面是我的学习笔记本大家一起看看。 最简单的连接方法

例子

 代码如下 复制代码

<?php
$mem = new Memcache;
$mem->connect('127.0.0.1', 11211) or die ("Could not connect");
$mem->set('key', 'This is a test!', 0, 60);
$val = $mem->get('key');
echo $val;
?>

应用中会做一个类

 代码如下 复制代码

class MCache
{

    private static $server  = array('127.0.0.1', 11211);
    private static $client  = 'memcached'; // memcache or memcached

    private static function get_memcache()
    {
        static $memcache;
        if (!is_object($memcache))
        { www.111cn.net
            $memcache = self::$client === 'memcached' ?  new Memcached() : new Memcache ;
            $memcache->addServer(self::$server[0],self::$server[1]);
        }
        return $memcache;
    }

    public static  function set($key, $value, $expire=600)
    {
        self::$client === 'memcached' ?  self::get_memcache()->set($key, $value, $expire)
                                :  self::get_memcache()->set($key, $value, MEMCACHE_COMPRESSED, $expire);
    }

    public static  function get($key)
    {
        return self::get_memcache()->get($key);
    }

}

MCache::set('test_one', 'value_one', 60); # 60 Sec
print_r(MCache::get('test_one'));


PHP的Memcache客户端所有方法总结

memcache函数所有的方法列表如下:
Memcache::add – 添加一个值,如果已经存在,则返回false
Memcache::addServer – 添加一个可供使用的服务器地址
Memcache::close – 关闭一个Memcache对象
Memcache::connect – 创建一个Memcache对象
memcache_debug – 控制调试功能
Memcache::decrement – 对保存的某个key中的值进行减法操作
Memcache::delete – 删除一个key值
Memcache::flush – 清除所有缓存的数据
Memcache::get – 获取一个key值
Memcache::getExtendedStats – 获取进程池中所有进程的运行系统统计
Memcache::getServerStatus – 获取运行服务器的参数
Memcache::getStats – 返回服务器的一些运行统计信息
Memcache::getVersion – 返回运行的Memcache的版本信息
Memcache::increment – 对保存的某个key中的值进行加法操作
Memcache::pconnect – 创建一个Memcache的持久连接对象
Memcache::replace -对一个已有的key进行覆写操作
Memcache::set – 添加一个值,如果已经存在,则覆写
Memcache::setCompressThreshold – 对大于某一大小的数据进行压缩
Memcache::setServerParams – 在运行时修改服务器的参数

 

[!--infotagslink--]

相关文章

  • photoshop设计一幅大鱼海棠动画片海报制作实例教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说设计一幅大鱼海棠动画片海报制作的实例教程,各位想知道具体制作步骤的使用者们,那么各位就快来看看...2016-09-14
  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    这篇文章主要介绍了C语言程序设计第五版谭浩强课后答案(第二章答案),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-04-02
  • 学习JavaScript设计模式之装饰者模式

    这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • Photoshop设计商务名片的5种常见思路分享

    今天小编在这里就来给Photoshop的这一款软件的使用者们来说下计商务名片的5种常见思路,各位想知道的使用者,那么下面就快来跟着小编一起看一看吧。 给各位Photosho...2016-09-14
  • WPF实现类似360安全卫士界面的程序源码分享

    最近在网上看到了新版的360安全卫士,感觉界面还不错,于是用WPF制作了一个,时间有限,一些具体的控件没有制作,用图片代替了。感兴趣的朋友一起跟着小编学习WPF实现类似360安全卫士界面的程序源码分享...2020-06-25
  • photoshop安卓和苹果界面设计之尺寸规范详解

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说下安卓和苹果的界面设计之尺寸规范,各位想知道的使用者们,那么下面就快来跟着小编一起看看吧。 给...2016-09-14
  • photoshop设计重影效果具体制作教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说设计重影效果具体的制作教程,各位想知道具体制作方法的软件使用者们,那么大家就来看下小编带来的教...2016-09-14
  • JavaScript设计模式之职责链模式

    这篇文章主要介绍了JavaScript设计模式之职责链模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • PS怎么设计T恤 PS制作T恤教程

    PS怎么设计T恤?很多人都想要在T恤上有自己喜欢的图案,那么自己设计T恤的图案是方法之一,本次为大家带来了详细的ps设计T恤教程,有兴趣的同学快来看看吧。 1、打开PS,新...2016-12-31
  • Illustrator结合photoshop设计可爱的卡通女厨师头像制作教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说结合photoshop设计可爱的卡通女厨师头像的制作教程,各位想知道具体制作步骤的使用者们,那么下面就快来...2016-09-14
  • photoshop设计一张节约用水环保主题海报制作教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来详细的说说设计一张节约用水环保主题海报的制作教程,各位想知道具体制作方法的使用者们,那么下面就快来跟着小...2016-09-14
  • 学习JavaScript设计模式之状态模式

    这篇文章主要为大家介绍了JavaScript设计模式中的状态模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-12
  • 学习JavaScript设计模式之单例模式

    这篇文章主要为大家介绍了JavaScript设计模式中的单例模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • JavaScript设计模式之命令模式

    这篇文章主要介绍了JavaScript设计模式之命令模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • c#实现51单片机频率计的代码分享(数字频率计设计)

    c#实现51单片机频率计的代码分享,大家参考使用吧...2020-06-25
  • 学习JavaScript设计模式之责任链模式

    这篇文章主要为大家介绍了JavaScript设计模式中的责任链模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • photoshop设计蜘蛛侠纹理文字效果制作教程

    今天小编在这里就来给给各位photoshop的这一款软件的使用者们来说一说设计蜘蛛侠纹理文字效果的制作教程,各位想知道具体制作步骤的使用者们,那么大家下面就来跟着小编...2016-09-14
  • Photoshop设计武侠风毛笔字效果教程

    今天小编在这里就来给Photoshop的这一款软件的使用者们说下设计武侠风毛笔字效果得教程,各位想知道到底该怎么射击制作的使用者们,那么下面就快来跟着小编一起看一看制...2016-09-14