PHP头条
热点:

【php】PHP单例模式,


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

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

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

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

单例模式的要点有三个:

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

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

private static $_instance;

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

构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:

private function __construct() { $this->_db = pg_connect(‘xxxx’); } private function __clone(){}//覆盖__clone()方法,禁止克隆

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

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

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

    } 

 

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

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

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

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

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

一个例子:

对于资源密集,配置开销较大的单体更合理的做法是将实例化(new)推迟到使用它的时候。即惰性加载(Lazy loading),它常用于那些必须加载大量数据的单体.,getInstance第一次new self以后,赋值成功,避免重复new self

1 <?php
2 class MyClass {
3  
4     // singleton instance
5     private static $instance;
6  
7     // private constructor function
8     // to prevent external instantiation
9     private function  __construct() {
10  
11         echo 'aa';
12     }
13  
14     // getInstance method
15     public static function getInstance() {
16  
17         if(!self::$instance) {
18             self::$instance = new self();
19         }
20  
21         return self::$instance;
22  
23     }
24  
25     //...
26  
27 }
28  
29 MyClass::getInstance();
30 ?>

JS版本的单例模式

1 var Singleton = (function () {
2     var instantiated;
3     function init() {
4         /*这里定义单例代码*/
5         return {
6             publicMethod: function () {
7                 console.log('hello world');
8             },
9             publicProperty: 'test'
10         };
11     }
12  
13     return {
14         getInstance: function () {
15             if (!instantiated) {
16                 instantiated = init();
17             }
18             return instantiated;
19         }
20     };
21 })();
22  
23 /*调用公有的方法来获取实例:*/
24 Singleton.getInstance().publicMethod();

www.phpzy.comtrue/php/25540.htmlTechArticle【php】PHP单例模式, 首先我们要知道明确单例模式这个概念,那么什么是单例模式呢? 单例模式顾名思义,就是只有一个实例。 作为对象的创建模式, 单例模式确保某一个类只有一个...

相关文章

    暂无相关文章

PHP之友评论

今天推荐