徐州建站费用,wordpress怎么进入论坛,中国建设集团总公司官网,帮我搜一下长沙做网络销售2019独角兽企业重金招聘Python工程师标准 首先我们要明确单例模式这个概念#xff0c;那么什么是单例模式呢#xff1f; 单例模式顾名思义#xff0c;就是只有一个实例。作为对象的创建模式#xff0c;单例模式确保某一个类只有一个实例#xff0c;而且自行… 2019独角兽企业重金招聘Python工程师标准 首先我们要明确单例模式这个概念那么什么是单例模式呢 单例模式顾名思义就是只有一个实例。作为对象的创建模式单例模式确保某一个类只有一个实例而且自行实例化并向整个系统提供这个实例这个类我们称之为单例类。 单例模式的要点有三个 一是某个类只能有一个实例 二是它必须自行创建这个实例 三是它必须自行向整个系统提供这个实例。 ?php
/* 单例模式举例,其要点如下:** 1. $_instance 必须声明为静态的私有变量* 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义* 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用* 4. ::操作符只能访问静态变量或静态函数* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后所有的相关资源都会被回收。* 也就是说PHP在语言级别上没有办法让某个对象常驻内存。在PHP中所有的变量都是页面级的无论是全局变量* 还是类的静态成员都会在页面执行完毕后被清空,结果会重新建立新的对象这样也就完全失去了Singleton的意义。* 不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复* new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的*
*/
class People {static private $_instance NULL;public $height ;public $age ;private function __construct() {$this-height 185;$this-age 25;}private function __clone() {//do something}static public function getInstance() {if (!self::$_instance instanceof self) {//echo lgh-big;self::$_instance new self;} else {//for testing only//echo gdc-xiaoairener;}return self::$_instance;}public function getHeight() {echo $this-height;}public function getAge() {echo $this-age;}
}
function testInstance() {People::getInstance()-getAge();
}
//begin to use the class
$lgh People::getInstance();
$lgh-getHeight();
echo br /;
testInstance();
? 下面我们讨论下为什么要使用PHP单例模式 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种计划生育。而PHP每次执行完页面都是会从内存中清理掉所有的资源。因而PHP中的单例实际每次运行都是需要重新实例化的这样就失去了单例重复实例化的意义了。单单从这个方面来说PHP的单例的确有点让各位失望。但是单例仅仅只有这个功能和应用吗答案是否定的我们一起来看看。 1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作在使用面向对象的方式开发时如果使用单例模式则可以避免大量的new 操作消耗的资源。 2. 如果系统中需要有一个类来全局控制某些配置信息那么使用单例模式可以很方便的实现。这个可以参看zend Framework的FrontController部分。 3. 在一次页面请求中便于进行调试因为所有的代码(例如数据库操作类db)都集中在一个类中我们可以在类中设置钩子输出日志从而避免到处var_dump, echo。 使用传统方式编码 ?php
//初始化一个数据库句柄
$db new DB();
//比如有个应用场景是添加一条用户信息
$db-addUserInfo();
//然而我们在另外一个地方可能要查找用户的信息这个情景出现在一个函数中这时要用到数据库句柄资源我们可能需要这么去做
function test() {//这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下这样的代码是多么可怕啊$db new DB();$db-getUserInfo();//有些朋友或许会说我也可以不这样做啊我直接利用global关键字不就可以了吗的确global可以解决问题也起到了单例模式的作用但是OOP中我们拒绝这样来编写代码因为global存在安全隐患请参考相关书籍同时单例模式恰恰是对全局变量的一种改进避免了那些存储唯一实例的全局变量污染命名空间global $db; //OOP中我们不提倡这样编写代码
}使用单例模式编码 ?php
//所有的应用情景只有一个数据库句柄资源嘿嘿效率老高了
//资源也大大的得到节省代码简洁明了
DB::getInstance()-addUserInfo();
DB::getInstance()-getUserInfo(); PHP单例模式实现的核心要点有如下三条 1.需要一个保存类的唯一实例的静态成员变量通常为$_instance私有变量 2.构造函数和克隆函数必须声明为私有的这是为了防止外部程序new类从而失去单例模式的意义 3.必须提供一个访问这个实例的公共的静态方法通常为getInstance方法从而返回唯一实例的一个引用 在了解了单例模式的应用场景之后下面我们通过编写单例模式的具体实现代码来掌握PHP单例模式的核心要点代码如下 ?php
/*** PHP单例模式演示举例* author guohua.li* modify 2010-07-11* website http://blog.163.com/lgh_2002/*/
class User {/*** 静态成品变量 保存全局实例* access private*/static private $_instance NULL;/*** 私有化构造函数防止外界实例化对象*/private function __construct() {}/*** 私有化克隆函数防止外界克隆对象*/private function __clone() {}/*** 静态方法, 单例统一访问入口* return object 返回对象的唯一实例*/static public function getInstance() {if (is_null(self::$_instance) || !isset(self::$_instance)) {self::$_instance new self();}return self::$_instance;}/*** 测试方法: 获取用户名字*/public function getName() {echo hello liguohua!;}
}PHP单例模式的缺点 众所周知PHP语言是一种解释型的脚本语言这种运行机制使得每个PHP页面被解释执行后所有的相关资源都会被回收。也就是说PHP在语言级别上没有办法让某个对象常驻内存这和asp.net、Java等编译型是不同的比如在Java中单例会一直存在于整个应用程序的生命周期里变量是跨页面级的真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中所有的变量无论是全局变量还是类的静态成员都是页面级的每次页面被执行时都会重新建立新的对象都会在页面执行完毕后被清空这样似乎PHP单例模式就没有什么意义了所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。 参考链接 http://www.cnblogs.com/zox2011/archive/2011/09/20/2182119.html 转载于:https://my.oschina.net/jiangbianwanghai/blog/903676