Login
网站首页 > 文章中心 > 其它

看懂php单例模式_Php如何实现单例模式

作者:小编 更新时间:2023-10-12 16:24:45 浏览量:365人看过

PHP设计模式之单例模式

单例模式

:使得类的一个对象成为系统中的唯一实例.

PHP中使用单例模式最常见的就是数据库操作了.避免在系统中有多个连接数据库的操作,浪费系统资源的现象,就可以使用单例模式.每次对数据库操作都使用一个实例.

简单示例

class

AClass

{

//

用来存储自己实例

public

static

$instance;

私有化构造函数,防止外界实例化对象

private

function

__construct()

{}

私有化克隆函数,防止外界克隆对象

__clone()

静态方法,单例访问统一入口

getInstance()

if

(!(self::$instance

instanceof

self)){

self::$instance

=

new

self();

}

return

self::$instance;

test

test()

"done";

BClass

extends

AClass{

获取实例

$aclass

AClass::getInstance();

$bclass

BClass::getInstance();

调用方法

echo

$aclass-test();

对一些比较大型的应用来说,可能连接多个数据库,那么不同的数据库公用一个对象可能会产生问题,比如连接句柄的分配等,我们可以通过给$instance变成数组,通过不同的参数来控制

DB

$instance

array();

$conn;

__construct($host,

$username,

$password,

$dbname,

$port)

$this-conn

mysqli($host,

$port);

getInstance($host,

$key

$host.":".$port;

(!(self::$instance[$key]

self::$instance[$key]

self($host,

$port);#实例化

self::$instance[$key];

//query

query($ql)

$this-conn-query($sql);

//释放资源

__destruct(){

$this-conn-close();

php 单例模式

单例模式是一种常用的软件设计模式,可以保证系统中一个类只有一个实例,从而达到节约系统资源提升特殊类使用效率的目的

php实现单例模式的方法

class?A?{

//静态属性

private?static?$_instance;

//空的克隆方法,防止被克隆

private?function?__clone()?{}

//获取实例

public?static?function?getInstance()?{

if(!(self::$_instance?instanceof?self))?{

self::$_instance?=?new?A();

return?self::$_instance;

//调用

$obj?=?A::getInstance();

PHP单例模式是什么 php实现单例模式的方法

单例模式是一种常用的软件设计模式.

在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.

如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案.

为什么要使用PHP单例模式及应用实例

单例模式顾名思义,就是只有一个实例.作为对象的创建模式,

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类.单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例.下面我们讨论下为什么要使用PHP单例模式?多数人都是从单例模式的字面上的意思来理解它的用途,

认为这是对系统资源的节省,

可以避免重复实例化,

是一种"计划生育".

而PHP每次执行完页面都是会从内存中清理掉所有的资源.

因而PHP中的单例实际每次运行都是需要重新实例化的,

这样就失去了单例重复实例化的意义了.

单单从这个方面来说,

PHP的单例的确有点让各位失望.

但是单例仅仅只有这个功能和应用吗?

答案是否定的,我们一起来看看.1.

php的应用主要在于数据库应用,

所以一个应用中会存在大量的数据库操作,

在使用面向对象的方式开发时(废话),

如果使用单例模式,

则可以避免大量的new

如果系统中需要有一个类来全局控制某些配置信息,

那么使用单例模式可以很方便的实现.

这个可以参看zend

Framework的FrontController部分.

怎么理解php中的设计模式

①.、单例模式:PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,所以呢PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:

a. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;

PHP单例模式应用场景有哪些

单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例.

复制代码 代码如下:

php

/* 单例模式举例,其要点如下:

*

* 1. $_instance 必须声明为静态的私有变量

* 也就是说,PHP在语言级别上没有办法让某个对象常驻内存.在PHP中,所有的变量都是页面级的,无论是全局变量,

* 还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义.

* 不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复

* new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的

*/

class People

static private $_instance = NULL;

public $height = '';

public $age = '';

private function __construct()

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();

优点:单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源

缺点:在PHP中,所有的变量无论是全局变量还是类的静态成员,都是 页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只 是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的.

Why–为什么要使用PHP单例模式?

PHP的一个主要应用场合就是应用程序与数据库打交道的应用场景,所以一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源.

还是有些抽象,给出代码片段.

使用传统方式编码

......

//初始化一个数据库句柄

$db = new DB(...);

//比如有个应用场景是添加一条用户信息:

$db-addUserInfo();

//然而我们在另外一个地方可能要查找用户的信息,这个情景出现在一个函数中,这时要用到数据库句柄资源,我们可能需要这么去做

function test(){

//这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?!

$db-getUserInfo();

//有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间

global $db; //OOP中,我们不提倡这样编写代码

使用单例模式编码

//所有的应用情景只有一个数据库句柄资源,嘿嘿,效率老高了,

//资源也大大的得到节省,代码简洁明了:)

DB::getInstance()-addUserInfo();

DB::getInstance()-getUserInfo();

How–如何来编写PHP单例模式?

在了解了单例模式的应用场景之后,下面我们通过编写单例模式的具体实现代码来掌握PHP单例模式的核心要点,代码如下:

/**

* PHP单例模式演示举例

* @author guohua.li

* @website

class User{

* 静态成品变量 保存全局实例

* @access private

* 私有化构造函数,防止外界实例化对象

private function __construct() {}

* 私有化克隆函数,防止外界克隆对象

private function __clone(){}

* 静态方法, 单例统一访问入口

* @return object 返回对象的唯一实例

static public function getInstance() {

if (is_null(self::$_instance) || !isset(self::$_instance)) {

self::$_instance = new self();

* 测试方法: 获取用户名字

public function getName() {

echo 'hello liguohua!';

从以上代码中,我们总结出PHP单例模式实现的核心要点有如下三条:

①需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)

PHP单例模式的缺点

众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收.也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性.然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的.

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章