Heim  >  Artikel  >  Backend-Entwicklung  >  (转)PHP 单例模式

(转)PHP 单例模式

WBOY
WBOYOriginal
2016-06-23 14:30:351007Durchsuche

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类我们称之为单例类。

单例模式的要点有三个:

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

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

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

下面我们讨论下为什么要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育".   而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo

例子

 1 <?php 2  3 /* 单例模式举例,其要点如下: 4  * 5  * 1. $_instance 必须声明为静态的私有变量 6  * 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义 7  * 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用 8  * 4. ::操作符只能访问静态变量或静态函数 9  *10  */11 12 class People {13     private static $_instance = NULL;14 15     public $height = '';16 17     public $age = '';18 19     private function __construct() {20         $this -> height = '185';21         $this -> age = 25;22     }23 24     private function __clone() {25         //do something26     }27 28     static public function getInstance() {29         if (!self::$_instance instanceof self) {30             //echo 'lgh-big';31             self::$_instance = new self();32         } else {33             //for testing only34             //echo 'gdc-xiaoairener';35         }36 37         return self::$_instance;38     }39 40     public function getHeight() {41         echo $this -> height;42     }43 44     public function getAge() {45         echo $this -> age;46     }47 48 }49 50 function testInstance() {51     People::getInstance() -> getAge();52 }53 54 //begin to use the class55 56 $lgh = People::getInstance();57 $lgh -> getHeight();58 59 echo '<br />';60 testInstance();61 ?>

另特注:
* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的

PHP技术交流群 170855791

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:php 上传参数Nächster Artikel:php之函数setcookie