PHP设计模式-单例模式学习笔记

 更新时间:2016年11月25日 14:57  点击:1380
单例模式是php中一个用得比较多的设计模式了,虽然很多人对于单例模式有居多说法,但是并不影响它的强大,下面我来给各位介绍自己在学习单例模式的笔记。

概要

创建型模式
保证一个类仅有一个实例,并且提供一个访问它的全局访问点

特点

1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例

结构图

Singleton

主要角色

Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。

优缺点

1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活

适用性

1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。

单例模式php实例

 代码如下 复制代码

<?php
         /**
         * 单例模式
         * ————-
         * @author         zhaoxuejie <zxj198468@gmail.com>
         * @package     design pattern
         * @version     v1.0 2011-12-14
         */
        class Singleton {
           
            //私有静态成员变量,保存全局实例
            private static $instance = NULL;
           
            //私有构造方法,保证外界无法直接实例化
            private function __construct(){}
           
            //静态方法,返回此类唯一实例
            public static function getInstance(){
                if(!isset(self::$instance)){
                    $c = __CLASS__;
                    self::$instance = new $c;
                }
                return self::$instance;
            }
           
            //测试用方法
            public function info(){
                return ‘ok’;
            }
           
            //防止克隆
            public function __clone(){
                throw new Exception(‘Error: Clone is not allowed.’);
            }
        }
        $s = Singleton::getInstance();
        echo $s->info();
 ?>

补充我看到另一篇关于单例模式介绍

 代码如下 复制代码

<?php
class EasyFramework_Easy_Mysql{
    protected static $_instance = null;
    private function __construct(){

    }
    public static function getInstance(){
        if (self::$_instance === null){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    protected function __clone(){

    }

}
$x = EasyFramework_Easy_Mysql::getInstance();
var_dump($x);

?>

/*
 * 1.第一步:
 * 既然是单例,也就是只能实例化一次,也就代表在实例化时
 * 不可能使用new关键字!!!!
 * 在使用new关键字时,类中的构造函数将自动调用。
 * 但是,如果我们将构造函数的访问控制符设置为protected或private
 * 那么就不可能直接使用new关键字了!!!
 * 第二步:
 * 无论protected/private修饰的属性或方法,请问在当前类的
 * 内部是否可以访问?---> 可以
 * 第三步:
 * 现在我们根本没有办法得到对象(因为你不能使用new关键字了),
 * 第四步:静态成员(包括属性或方法)在访问时,只能通过
 * 类名称::属性()
 * 类名称::方法()
 * 第五步:如果我现在存在一个静态方法--> getInstance()
 * 那么在调用时就应写成
 * $object = EasyFramework_Easy_Mysql::getInstance()
 * 如果,getInstance()方法可以得到唯一的一个对象
 * 也就代表是所谓的单例模式了!!!
 * 第六步,怎么让getInstace()只得到一个对象呢?
 * 既然要得到对象,那么肯定是:
 * $variabl = new ????();
 * 我们又知道静态属性的值是可以所有的对象来继承的!!!
 * 静态成员是属于类的,而非对象的!
 * 所以:
 * 第七步:声明一个静态的属性,用其存储实例化的对象
 * protectd static $_instance
 *
 * 并且初始值为null
 * 那么我在调用getInstance()方法时,只需要判断其值是否为空即可
 *
 * public static function getInstance(){
 *     if(self::_instance === null){
 *      self::_instance = new self();
 *  }
 *  return self::_instance;
 * }
 * 在实例时,一定是这样写:
 * $x = EasyFramework_Easy_Mysql::getInstance();
 * 在第一时调用时,类的$_instance这个静态属性值为null,
 * 那么也就代表,getInstance()方法的判断条件为真了,
 * 也就意味着
 * self::$_instance这个成员有了值了!!!
 * 并且还返回这个值
 * $y = EasyFramework_Easy_Mysql::getInstance();
 * 在第二次或第N次调用时,self::$_instance已经有了值了
 * 也就代表getInstance()方法的条件为假了!!!
 * 也就代表其中的程序代表不可能执行了!!!
 * 也就代表将直接返回以前的值了!!!
 *
 *
 *
 * */

SecureCRT中文乱码肯定是设置的问题了,我们只要简单的修改一下SecureCRT设置就可以解决中文问题,下面一聚教程小编为各位介绍一下吧。


 修改SecureCRT的设置。找到“选项”->“会话选项”->“外观”:
    *    字符编码设置为utf-8。
    *    字体设置,选择中文字体,设置常用字体:新宋体。
如图:

SecureCRT中文乱码问题解决办法

下文整理了在开发中php数组的一些常用例子,这些数组例子对于新手是非常的有用哦,大家不防进入参考。

一、什么是数组
数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。数组的每个实体都包含两项:键和值。
二、声明数据
在PHP中声明数组的方式主要有两种:
一是应用array()函数声明数组,
一是直接为数组元素赋值。飞飞Asp!技术乐园
<1>array()函数声明的数组的方式array([mixed...]) 参数mixed的语法为key=>value
如,

 代码如下 复制代码

< ?php
$array=array("1"=>“编”,”2″=>”程”,”3″=>”词”,”4″=>”典”);
print_r($array);
echo “
“;
echo $array[1]; //注意:下标默认是从0开始
echo $array[2];
echo $array[3];
echo $array[4];
?>

<2>直接为数组元素赋值。
如果在创建数组时不知所创建数组的大小,或在实际编写程序时数组的大小可能发生变化,采用这种数组创建的方法较好。
如,

 代码如下 复制代码

< ?php
$array[1]="I";
$array[2]="love";
$array[3]="PHP";
print_r($array); //输出所创建数组的结构
?>

三、数组的类型
PHP支持两种数组:索引数组(indexed array)和联合数组(associative array),前者使用数字作为键,后者使用字符串作为键。
四、输出数组
在PHP中对数组元素输出,可以通过echo和print语句来实现,但这只能对数组中某一元素进行输出;要将数组结构输出则要使用print_r()函数,其语法:print_r(mixed expression),参数expression为普通的整形、字符型或实型变量则输出该变量本身,如果该参数为数组,则按一定键值和元素的顺序显示出该数组中的所有元素。
五、数组的构造
一维数组:
当一个数组的元素是变量时,则称其为一维数组。飞飞As.p技术乐园
声明一位数组: 类型说明符 数组名[常量表达式];
二维数组:
当一个数组的元素是一个一位数组时,则称之为二维数组。
如,

 代码如下 复制代码

< ?php
$str = array (
"网络编程语言"=>array (“PHP”,”JSP”,”ASP”),
“体育项目”=>array (“m”=>”足球”,”n”=>”篮球”));
print_r ( $str) ;
?>

六、遍历数组
遍历数组中的所有元素是常用的一种操作,在遍历的过程中可以完成查询或其他功能。在PHP中遍历数组的方法有多种,下面介绍最常用的两种方法。
<1>使用foreach结构遍历数组;
<2>使用list()函数遍历数组,list()函数仅能用于数字索引的数组,且数字索引从0开始。
例:综合使用list()和each()认证用户登录:

 代码如下 复制代码

< ?php
//输出用户登录信息
while(list($name,$value)=each($_POST)){
if($name!="submit"){
echo "$name=$value
“;
}
}
?>

七、统计数组元素个数
在PHP中,使用count()函数对数组中的元素个数进行统计,语法为:int coun(mixed array[,int mode]),其中参数array为必要参数,mode为可选参数,若选中COUNT——RECURSIVE(或1),本函数将递归地对数组数组。如,

 代码如下 复制代码

< ?php
$array = array("php" => array(“PHP函数参考大全”,”PHP程序开发范例宝典”,”PHP数据库系统开发完全手册”),
“asp” => array(“ASP经验技巧宝典”)
); //声明一个二维数组
echo count($array,COUNT_RECURSIVE);//递归统计数组元素的个数,运行结果为6
?>

八、数组排序
<1>使用sort()和rsort()分别对数组进行升序和降序,如,

 代码如下 复制代码
< ?php
$array=array(5,26,37,18,9,42,88,66);
$array1=sort($array);
for($i=0;$i echo $array[$i]." ";
}
echo "
“;
$array1=rsort($array);
for($i=0;$i echo $array[$i]." ";
}
?>
运行结果:
5 9 18 26 37 42 66 88
88 66 42 37 26 18 9 5

<2>使用ksort()和asort()对关联数组排序
如果使用了相关数组,在排序后还要保持关键字和值的排序一致,这是就需要使用ksort()和asort()函
数,如,

 代码如下 复制代码
< ?php
$array=array('php'=>1,’jsp’=>2,’asp’=>3);
ksort($array);
print_r($array);
echo “
“;
asort($array);
print_r($array);
?>
运行结果:
Array ( [asp] => 3 [jsp] => 2 [php] => 1 )
Array ( [php] => 1 [jsp] => 2 [asp] => 3 )
单引号与双引号对于定义字符一个是可以解析变量一个是会把变量直接输出来,同时单引号与双引号在字符处理上单引号要优与双引号哦

①转义的字符不同

单引号和双引号中都可以使用转义字符(\),但只能转义在单引号中引起来的单引号和转义转义符本身。如果用双引号(“”)括起字符串,PHP懂得更多特殊字符串的转义序列。

 代码如下 复制代码
<?php
$str1 = '\',\\,\r\n\t\v\$\"';
echo $str1,'<br />';
 
$str2 = "\",\\,a\r\n\tb\v\$\'";
echo $str2,'<br />';
?>

②对变量的解析不同
单引号字符串中出现的变量不会被变量值替代。即PHP不会解析单引号中的变量,而是将变量名原样输出。双引号字符串最重要的一点是其中的变量名会被变量值替代,即可以解析双引号中包含的变量。

 代码如下 复制代码
<?php
$age = 20;
$str1 = 'I am $age years old';
$str2 = "I am $age years old";
echo $str1,'<br />'; // I am $age years old
echo $str2,'<br />'; // I am 20 years old;
?>

③解析速度不同

单引号不需要考虑变量的解析,速度比双引号快.推荐用单引号.有的时候双引号也比较好用,比如在拼凑sql 语句

反斜杠

 

 代码如下 复制代码
//使用单引号
echo ' this \n is \r the blog \t of \\ zhoumanhe \\'; 
//上面使用单引号输出的值是 this \n is \r the blog \t of \ zhoumanhe \
 
 
echo '
';
echo "
";
 
 
//使用双引号
echo "this \n is \r the blog \t of \\ zhoumanhe \\"; 
//上面使用双引号输出的值是 this is the blog of \ zhoumanhe \


使用sql

 代码如下 复制代码
假设查询条件中使用的是常量,例如:
select * from abc_table where user_name=’abc’;
SQL语句可以写成:
SQLstr = “select * from abc_table where user _name= ‘abc’” ;
假设查询条件中使用的是变量,例如:
$user_name = $_REQUEST['user_name']; //字符串变量

$user=array (”name”=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//数组变量
SQL语句就可以写成:
SQLstr = “select * from abc_table where user_name = ‘ ” . $user_name . ” ‘ “;
SQLstr = “select * from abc_table where user_name = ‘ ” . $user["name"] . ” ‘ “;
对比一下:
SQLstr=”select * from abc_table where user_name = ‘ abc ‘ ” ;
SQLstr=”select * from abc_table where user_name =’ ” . $user _name . ” ‘ “;
SQLstr=”select * from abc_table where user_name =’ ” . $user["name"] . ” ‘ “;
SQLstr可以分解为以下3个部分:
1:”select * from table where user_name = ‘ ” //固定SQL语句
2:$user //变量
3:” ‘ ”

 
附:大家也看到了 echo '<br/>'; html中的标签在单引号和双引号中都有效。

总结一下PHP引号使用原则

1.字符串的值用引号

2.PHP中尽量用单引号,HTML代码全部用双引号

3.在包含变量的时候,用双引号可以简化操作

4.复杂的情况下用大括号包起来

PHP引号还有一个用处就是,有的时候需要用php生成文本文件,换行符n需要用双引号才能好使,单引号则会直接把n当成字符输出。

使用总结:在字符串里面不需要加入 变量 或者 单引号(')和反斜杠(\) 时,尽量用单引号引字符串,因为省去了双引号检查处理转义和解析变量上面的时间。能用单引号尽量用单引号。

PHP中数组函数有很多,我们要对数据进行合并与追加都只要使用相关的函数就可以完成了,下面给各位整理几个例子。

PHP合并数组我们可以使用array_merge()函数,array_merge()函数返回一个联合的数组。所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次追加。其形式为:

array array_merge (array array1 array2…,arrayN)

下面是一个PHP合并数组的例子:

 代码如下 复制代码

<?php
$fruits = array("apple","banana","pear");
$numbered = array("1","2","3");
$cards = array_merge($fruits, $numbered);
print_r($cards);
// 输出结果:
// Array ( [0] => apple [1] => banana [2] => pear [3] => 1 [4] => 2 [5] => 3 )
?>

用PHP追加数组,使用array_merge_recursive(),将两个数组合并在一起,注意,与array_merge()函数是不一样的,array_merge()的两个数组有重复项时会覆盖掉,而array_merge_recursive()则不会。array_merge_recursive()语法:


array array_merge_recursive(array array1,array array2[…,array arrayN])

下面是一个PHP追加数组的例子:

 代码如下 复制代码

<?php
$fruit1 = array("apple" => "red", "banana" => "yellow");
$fruit2 = array("pear" => "yellow", "apple" => "green");
$result = array_merge_recursive($fruit1, $fruit2);
print_r($result);
// 输出结果:
// Array ( [apple] => Array ( [0] => red [1] => green ) [banana] => yellow [pear] => yellow )
?>

现在apple 指向一个数组,由两个颜色值组成的索引数组,还有一种比较怪的做法就是合并数组

array_splice()语法格式为:
array array_splice ( array array , int offset[,length[,array replacement]])

例子

 代码如下 复制代码

<?php
$fruits = array("Apple", "Banana", "Orange", "Pear", "Grape", "Lemon", "Watermelon");
$subset = array_splice($fruits, 4);
print_r($fruits);
print_r($subset);
// 输出结果为:
// Array ( [0] => Apple [1] => Banana [2] => Orange [3] => Pear )
// Array ( [0] => Grape [1] => Lemon [2] => Watermelon )
?>

我们还可以使用可选参数replacement来指定取代目标部分的数组。请看下面的例子:

 代码如下 复制代码

<?php
$fruits = array("Apple", "Banana", "Orange", "Pear", "Grape", "Lemon", "Watermelon");
$subset = array_splice($fruits, 2, -1, array("Green Apple", "Red Apple"));
print_r($fruits);
print_r($subset);
// 输出结果:
// Array ( [0] => Apple [1] => Banana [2] => Green Apple [3] => Red Apple [4] => Watermelon )
// Array ( [0] => Orange [1] => Pear [2] => Grape [3] => Lemon )
?>

[!--infotagslink--]

相关文章

  • javascript设计模式之解释器模式详解

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

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

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

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

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

    这篇文章主要介绍了JavaScript设计模式之命令模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
  • PHP单例模式静态类解析和实现源代码

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

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

    这篇文章主要为大家介绍了JavaScript设计模式中的状态模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-14
  • PHP 单例模式优点意义及如何实现

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便...2016-11-25
  • 学习JavaScript设计模式之观察者模式

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

    这篇文章主要给大家介绍的是JavaScript中的单例模式,设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,需要的朋友可以参考一下...2021-09-25
  • C# 设计模式系列教程-组合模式

    组合模式可以使客户端调用简单,它可以一致使用组合结构或是其中单个对象,简化了客户端代码。...2020-06-25
  • C#单例模式(Singleton Pattern)详解

    这篇文章主要为大家详细介绍了C#单例模式Singleton Pattern的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Javascript设计模式之原型模式详细

    这篇文章主要介绍了Javascript设计模式之原型模式,原型模式用于在创建对象时,通过共享某个对象原型的属性和方法,从而达到提高性能、降低内存占用、代码复用的效果。下面小编将详细介绍,需要的朋友可以参考下...2021-09-30
  • PHP单例模式实例浅析

    全局变量是面向对象程序员遇到的引发bug的主要原因之一。这是因为全局变量将类捆绑于特定的环境。破坏了封装。如果新的应用程序无法保证一开始就定义了相同的环境变...2016-11-25
  • PHP单例模式学习笔记详解

    单例模式是php中一个为了简化大家开发及重复调用的一个功能,下面我来给各位朋友详细介绍单例模式用法。 1.单例模式的概念 顾名思义,单例模式只有一个实例,而且自行...2016-11-25
  • C# 设计模式系列教程-单例模式

    单例模式防止在应用程序中实例化多个对象。这就节约了开销,每个实例都要占用一定的内存,创建对象时需要时间和空间。...2020-06-25
  • 详解设计模式中的模板方法模式及在C++中的使用

    这篇文章主要介绍了设计模式中的模板方法模式及在C++中的使用,模板方法将逻辑封装到一个类中,并采取组合(委托)的方式解决这个问题,需要的朋友可以参考下...2020-04-25
  • 深入浅出23种设计模式

    本文给大家详解23种设计模式,理解设计模式有助于在程序开发过程中灵活应用,需要的朋友可以参考下...2020-06-25