• (转)PHP 单例模式


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

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

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

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

    单例模式的要点有三个:

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

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

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

    下面我们讨论下为什么要使用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 something
    26     }
    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 only
    34             //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 class
    55 
    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

  • 相关阅读:
    在 LR 中如何解决Socket 接收数据的验证
    UE 的文件比较方法
    使用plSQL连接Oracle报错,SQL*Net not properly installed和TNS:无法解析指定的连接标识符
    plsql developer连接oracle数据库
    将列表中的字符以‘*’连接生成一个新的字符串
    ElasticSearch之CURL操作
    MySQL 5.7.21 免安装版配置教程
    C# IL DASM 使用-破解c#软件方法
    For-each Loop,Index++ Loop , Iterator 那个效率更高
    10种简单的Java性能优化
  • 原文地址:https://www.cnblogs.com/gbyukg/p/2487085.html
Copyright © 2020-2023  润新知