PHP中单例模式的详细解析

 更新时间:2016年12月21日 21:07  点击:1730
本篇文章主要介绍了php的单例模式,还附上了实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

PHP单例模式详解

单例模式的概念

单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式的特点

单例模式的主要特点是“三私一公”:

需要一个保存类的唯一实例的私有静态成员变量

构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义

克隆函数必须声明为私有的,防止对象被克隆

必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。

使用单例模式的原因及场景

在PHP的大多数应用中都会存在大量的数据库操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的系统资源和内存资源,而且每次打开和关闭数据库都是对数据库的一种极大考验和浪费。所以单例模式经常用在数据库操作类中。

同样,如果系统中需要有一个类来全局控制某些配置信息,那使用单例模式可以很方便的实现。

PHP单例模式实现

下面是一个PHP单例模式实现数据库操作类的框架

<?php
 classDb{
 constDB_HOST='localhost';
 constDB_NAME='';
 constDB_USER='';
 constDB_PWD='';
 private$_db;
 //保存实例的私有静态变量
 privatestatic$_instance;
 //构造函数和克隆函数都声明为私有的
 privatefunction__construct(){
 //$this->_db=mysql_connect();
 }
 privatefunction__clone(){
 //实现
 }
 //访问实例的公共静态方法
 publicstaticfunctiongetInstance(){
 if(!(self::$_instanceinstanceofself)){
 self::$_instance=newself();
 }
 //或者
 if(self::$_instance===null){
 self::$_instance=newDb();
 }
 returnself::$_instance;
 }
 publicfunctionfetchAll(){
 //实现
 }
 publicfunctionfetchRow(){
 //实现
 }
 }
 //类外部获取实例的引用
 $db=Db::getInstance();
?>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://www.manongjc.com/article/557.html

一聚教程网小编推荐的这篇文章介绍了PHP中的浅析机制,希望能帮助到正在学习PHP的同学!

1. 介绍

-- PHP5添加了一项新的功能:Reflection。这个功能使得phper可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

-- 反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。

通过ReflectionClass,我们可以得到Person类的以下信息:

1)常量 Contants

2)属性 Property Names

3)方法 Method Names静态

4)属性 Static Properties

5)命名空间 Namespace

6)Person类是否为final或者abstract

2. 具体例子

创建一个Person类,然后使用ReflectionClass反射它

2.1)【创建Persion类】

classPerson {
 /**
   * For the sake of demonstration, we"re setting this private
   */
 private$_allowDynamicAttributes= false;
 /** type=primary_autoincrement */
 protected$id= 0;
 /** type=varchar length=255 null */
 protected$name;
 /** type=text null */
 protected$biography;
 publicfunction getId()
   {
 return$this->id;
   }
 publicfunctionsetId($v)
   {
 $this->id =$v;
   }
 publicfunctiongetName()
   {
 return$this->name;
   }
 publicfunctionsetName($v)
   {
 $this->name =$v;
   }
 publicfunctiongetBiography()
   {
 return$this->biography;
   }
 publicfunctionsetBiography($v)
   {
 $this->biography =$v;
   }
 }
Persion

2.2)【反射过程】

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

$class=newReflectionClass('Person');//建立 Person这个类的反射类
$instance=$class->newInstanceArgs($args);//相当于实例化Person 类

2.3)【反射后使用】

2.3.1)获取属性(Properties)

$properties=$class->getProperties();
 foreach($propertiesas$property) {
 echo$property->getName()."\n";
 }
 // 输出:
 // _allowDynamicAttributes
 // id
 // name
 // biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

privateproperties=privateproperties=class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。

通过$property->getName()可以得到属性名。

2.3.2)【获取注释】

通过getDocComment可以得到写给property的注释。

foreach($propertiesas$property) {
 if($property->isProtected()) {
 $docblock=$property->getDocComment();
   preg_match('/ type\=([a-z_]*) /',$property->getDocComment(),$matches);
 echo$matches[1]."\n";
  }
 }
 // Output:
 // primary_autoincrement
 // varchar
 // text

2.3.3)【获取类的方法】

获取方法(methods):通过getMethods() 来获取到类的所有methods。

2.3.4)【执行类的方法】

$instance->getBiography();//执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName');//获取Person 类中的getName方法
$ec->invoke($instance); //执行getName 方法

通道在PS中是必须要掌握的一个东西,本次一聚教程网为大家带来的photoshop通道教程,将为大家详细介绍photoshop通道怎么用,请看下文。

一、利用选择工具

Photoshop中的选择工具包括遮罩工具(Marquee)、套索工具(Lasso)、魔术棒(Magic Wand)、字体遮罩(Type Mask)以及由路径转换来的选区等,其中包括不同羽化值的设置。利用这些工具在通道中进行编辑与对一个图象的操作是相同的,你所需的仅仅是一点点勇气。

使用选择工具可以完成一些最基本的操作,可是如果你要我确切的举例来说明,倒也有些难处,因为我实在记不起在我近来的工作中有哪一部分是单纯利用选择工具来编辑通道的。或许是在对一个已经通过其他方法建立的选区稍做修改的时候?实在是这种方法太基本了,你必须要明白却又几乎察觉不到它的存在。

二、利用绘图工具

绘图工具包括喷枪(Airbrush)、画笔(Paintbrush)、铅笔(Pencil)、图章(Stamp)、橡皮擦(Eraser)、渐变(Gradient)、油漆桶(PaintBucket)、模糊锐化和涂抹(Blur、Sharpen、Smudge)、加深减淡和海绵(Dodge、Burn、Sponge)。

现在应该很容易理解我们平时操作的通道所具备的颜色的问题。当你看到任何一种选择带来的白色时,就应该有一种用手指去涂抹一下的冲动。

当然这样做带来的后果也许只能改变你心爱的的显示屏的颜色,但你大可用画笔这类的工具作为替代品去实验一下,相信第一次这样做所引起的后果是激动人心的(如果你说不,那你向我保证你绘画时所用的颜色与你正涂抹位置的颜色不一样)。

的确任何选择区域你都可以用你随手可以捡到的绘图工具去创建,其间唯一的区别也许只是你看不到那些黑白相间不断行动的线条了。

利用绘图工具编辑通道的一个优势在于你可以精确的控制笔触(虽然比不上绘图板),从而可以得到更为柔和以及足够复杂的边缘。实际的去运用一下,你很快会喜欢上它们。现在我所做的每一幅图片,只要涉及通道,80% 以上时从画笔开始的。因为我并不需要一团黑或者一团白。

这里要提一下的,是渐变工具。因为这种工具比较特别。不是说它特别复杂,而是说它特别容易被人忽视。但相对于通道确又是特别的有用。它是我所知道的photoshop中严格意义上的一次可以涂画多种颜色而且包含平滑过度的绘画工具,针对于通道而言,也就是带来了平滑细腻的渐变。我想当你要把自己完美的融合到大自然中去时,从这里开始是个不错的主意。

三、利用滤镜

曾经有人问我怎样才算是好的美术作品。当时我告诉他是那些完美地把自然因素与人为创作结合在一起的作品。实质上,一直以来,我同样也在思考这个问题。

同大多数人一样,我坚信人的创造力和想象力是无限的,但我也深知,这并不代表一个人可以想象出所有的东西。有时候,把自己隔离开,任由Photoshop去创作未尝不是一件好事,实际上那是相当有趣的一个方式。

在通道中进行滤镜操作,通常是在有不同灰度的情况下,而运用滤镜的原因,通常是因为我们刻意追求一种出乎意料的效果或者只是为了控制边缘。

原则上讲,你可以在通道中运用任何一个滤镜去试验,当然这只是在你没有任何目的的时候,实际上大部分人在运用滤镜操作通道时通常有着较为明确的愿望,比如锐化或者虚化边缘,从而建立更适合的选区。各种情况比较复杂,需要根据目的的不同做相应处理,但你尽可试一下,总会有收获的。

四、利用调节工具

特别有用的调节工具包括色阶(level)和曲线(curves)。

在你用这些工具调节图象时,你会看到对话框上有一个channel选单,在这里可以所要编辑的颜色通道。当你选中希望调整的通道时,按住shift键,再单击另一个通道,最后打开图象中的复合通道。这样你就可以强制这些工具同时作用于一个通道。

对于编辑通道来说,这当然是有用的,但实际上并不常用的,因为你大可以建立调节图层而不必破坏最原始的信息,实际上,如果你再前面还不明白通道是什么的话,现在就应该明白了。说到底,对通道的理解不过是个感觉问题,也许顿悟就再一瞬间。

再强调一点,单纯的通道操作是不可能对图象本身产生任何效果的,必须同其他工具结合,如选区和蒙板(其中蒙板是最重要的),所以再理解通道时最好与这些工具联系起来,才能知道你精心制作的通道可以在图象中起到什么样的作用。

App接口返回的数据有两种xml或json数据了,当然json数据是最常见了就是我们接受到app请求我们返回json数据即可,这个操作非常的简单几乎可以不用学习即可开发App接口程序了,下面来看一篇文章。

搭建PHP环境

由于本人使用的电脑是Mac,因此推荐大家使用MAMP PRO这款软件,不过是收费版,相信不想花钱的大家会有办法搞定的!

MAMP PRO这款软件是集成环境软件,已经有apache、mysql、php了,具备运行解析PHP的环境了!

如果不想使用集成环境,可以自己搭建。Mac自带了apache和PHP环境的,只需要稍加配置一下就可以使用了,然后再安装一下mysql就可以了!

启动服务器

这里是以MAMP PRO软件为例,如何启动服务器。如下图,我们假设服务地址为www.api.com,然后将项目目录与这个服务地址关联起来,看图中右下角圈圈部分:

标哥的技术博客

环境启动后,就可以在浏览器中直接输入www.api.com运行起来了!

开始GET接口
我们的空项目在首次运行后,会自动生成index.php这个文件,我们删除里面的内容,然后修改如下:


<?php
 
$data = array(
    'tid' => 100,
    'name' => '标哥的技术博客',
    'site' => 'www.111cn.net');
   
$response = array(
    'code'    => 200,
    'message' => 'success for request',
    'data'    => $data,
    );
 
echo json_encode($response);
 
我们这里的结构是日常App开发中最常见的返回数据结构了吧?通常都是状态码、状态信息和客户端业务数据。

PHP其实也好给力,声明数组后,通过json_encode函数就可以输出json格式数据了!

iOS调GET接口
我们有了服务器,也写了接口了,那么客户端如何请求又如何获取数据呢?我们先来看一下最简单的GET请求例子,其中使用了HYBNetworking笔者的这个开源库:


NSString *url = @"http://www.api.com/index.php";
[HYBNetworking getWithUrl:url refreshCache:YES success:^(id response) {
   
} fail:^(NSError *error) {
   
}];
 
我们看一下iOS客户端的响应结果:

标哥的技术博客

从响应结果可以看到,与我们服务器接口所返回的是一致的,看下图在浏览器中访问的效果:

PHP开发App接口PHP POST接口

假设我们要求传参数type过来,而且要求是数值型,用于返回不同的数据,当我们做接口测试时,就可以通过这么来干,就不需要等后台给接口了!

 
<?php
 
$type = $_POST['type'];
$data = '';
 
if (isset($type) && is_numeric($type) && $type >= 0) {
    if ($type == 1) {
        $data = array(
            'type' => $type,
            'name' => '标哥的技术博客',
            'site' => 'www.111cn.net');
    } else if ($type == 2) {
        $data = array(
            'type' => $type,
            'name' => '公众号:标哥的技术博客',
            'site' => 'weixin search: biaogedejishuboke');
    }
 
    $response = array(
        'code'    => 200,
        'message' => 'success for request',
        'data'    => $data,
        );
 
    echo json_encode($response);
    return;
}
 
$response = array(
    'code'    => 999,
    'message' => 'argument error for request',
    'data'    => $data,
    );
 
echo json_encode($response);
 
iOS调POST接口

下面是iOS客户端如何调用刚才所写的PHP POST接口,其中使用了HYBNetworking笔者的这个开源库:

 
NSString *url = @"http://www.api.com/index.php";
NSDictionary *params = @{@"type" : @(1)};
[HYBNetworking postWithUrl:url refreshCache:YES params:params success:^(id response) {
   
} fail:^(NSError *error) {
   
}];
 
我们看看效果如下,可看到如愿地接收到了服务器返回的接口数据并解析出来了:

PHP开发app接口POST请求

[!--infotagslink--]

相关文章

  • 学习JavaScript设计模式之装饰者模式

    这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • Postgresql 如何选择正确的关闭模式

    这篇文章主要介绍了Postgresl 如何选择正确的关闭模式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-18
  • 如何开启mysql中的严格模式

    很多集成的PHP环境(PHPnow WAMP Appserv等)自带的MySQL貌似都没有开启MySQL的严格模式,何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数...2013-10-04
  • JavaScript设计模式之职责链模式

    这篇文章主要介绍了JavaScript设计模式之职责链模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • c#标准idispose模式使用示例

    下面将把C#里实现IDispose模式的代码展现出来,大家一起来学习一下,它的使用场合也很多的,当我们手动对网站,数据库作封装时,都会用的到...2020-06-25
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • JavaScript设计模式之命令模式

    这篇文章主要介绍了JavaScript设计模式之命令模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • 学习JavaScript设计模式之状态模式

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

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • 学习JavaScript设计模式之单例模式

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

    这篇文章主要为大家介绍了JavaScript设计模式中的状态模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-14
  • Java接口DAO模式代码原理及应用详解

    这篇文章主要介绍了Java接口DAO模式代码原理及应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-03
  • C#中的IDisposable模式用法详解

    这篇文章主要介绍了C#中的IDisposable模式用法,讲述了垃圾资源回收机制的实现,并对比分析了Dispose()方法、~DisposableClass()析构函数、虚方法Dispose(bool disposing)的原理,需要的朋友可以参考下...2020-06-25
  • 阿里云OpenSearch在php版sdk开启调试模式

    版本:php_v2.0.6 在CloudsearchClient的类中,开启debug模式,设置为true 如:$opts = array(&#39;host&#39;=>$host,&#39;debug&#39;=>true); 注意true不能加引号...2016-05-19
  • C#使用Dispose模式实现手动对资源的释放

    这篇文章主要介绍了C#使用Dispose模式实现手动对资源的释放,涉及C#采用Dispose模式操作资源的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • MIUI儿童模式如何开启 小米手机儿童模式开启教程

    您是否遇到过孩子想要玩手机又不好拒绝,或者是您想要给孩子配一个联系用的手机有担心孩子玩手机上瘾?如果您购买的是小米手机,那么MIUI的儿童模式就能很好地解决这个问题...2016-12-21
  • php单例模式实现方法分析

    本文实例讲述了php单例模式实现方法。...2015-03-15
  • PHP单例模式静态类解析和实现源代码

    我们建站的时候,开始是每次请求数据库都要重新连接的、这样显然不合理、然后自己封装了一个数据库操作类、DBTools.php、要解决一个连接多次使用的话、最好的办法是使...2016-11-25
  • 学习JavaScript设计模式之观察者模式

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