知识屋:更实用的电脑技术知识网站
所在位置:首页 > 编程技术 > PHP编程

php单例模式

发布时间:2014-09-05 10:26:56作者:知识屋

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

 

【单例模式的优点】
1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活

【单例模式适用场景】
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。

【单例模式与其它模式】
工厂方法模式(factory method模式):单例模式使用工厂模式来提供自己的实例。
抽象工厂模式(abstract factory模式):抽象工厂模式可以使用单例模式,将具体工厂类设计成单例类。
建造者模式(Builder模式):建造模式可以将具体建造类设计成单例模式

 

3.单例模式实例

 3.1 test.php


 

SPAN style="FONT-SIZE: 14px"><?php class Test{     public $service;          //静态成品变量 保存全局实例      private static $instance = null;          //用mysqli连接数据库      private static $SDB_USER = "test";     private static $SDB_DBNAME="test";       private static $SDB_HOST = 'localhost';     private static $SDB_PASS = 'ddddYQ3ddddUxEY';             //私有化构造函数,防止外界实例化对象      private function  __construct() {         $this->service = new mysqli(self::$SDB_HOST, self::$SDB_USER, self::$SDB_PASS, self::$SDB_DBNAME);            }          //私有化克隆函数,防止外界克隆对象      private function  __clone(){     }          //静态方法, 单例统一访问入口      public static function getInstance() {         if (!isset(self::$instance) || is_null(self::$instance)) {             self::$instance = new Test();         }         return self::$instance;     }          //测试方法: 打印hello,world      public function sayHello() {         echo 'hello,world';     } }  </SPAN> <?phpclass Test{ public $service;  //静态成品变量 保存全局实例 private static $instance = null;  //用mysqli连接数据库 private static $SDB_USER = "test"; private static $SDB_DBNAME="test";  private static $SDB_HOST = 'localhost'; private static $SDB_PASS = 'ddddYQ3ddddUxEY';   //私有化构造函数,防止外界实例化对象 private function  __construct() {  $this->service = new mysqli(self::$SDB_HOST, self::$SDB_USER, self::$SDB_PASS, self::$SDB_DBNAME);   }  //私有化克隆函数,防止外界克隆对象 private function  __clone(){ }  //静态方法, 单例统一访问入口 public static function getInstance() {  if (!isset(self::$instance) || is_null(self::$instance)) {   self::$instance = new Test();  }  return self::$instance; }  //测试方法: 打印hello,world public function sayHello() {  echo 'hello,world'; }}

3.2 data.php


 

SPAN style="FONT-SIZE: 14px"><?php require_once('test.php');  class TestObject {     protected $test;     function __construct($id=null) {         $this->test = Test::getInstance();         $this->test->sayHello();     }    }  $obj = new TestObject();</SPAN> <?phprequire_once('test.php');class TestObject { protected $test; function __construct($id=null) {  $this->test = Test::getInstance();  $this->test->sayHello(); } }

$obj = new TestObject();
运行data.php,结果:

 

 /(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)

收藏

相关知识

软件推荐

更多 >

游戏推荐

更多 >

精选栏目

热门推荐

猜你喜欢