php单例形式

今日在读书php面向对象时,看到三个面向对象的面试题

亚洲必赢app,单例方式确定保证有些类唯有一个实例,而且自行实例化并向整种类统提供那几个实例。

单例格局是一种普及的设计方式,在计算机类别中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。
单例格局有以下叁个特色:
一.只可以有一个实例。
2.供给自行创立这几个实例。
3.亟须给其余对象提供那一实例。


那便是说为何要利用PHP单例形式?
PHP贰个重视使用场馆就是应用程序与数据库打交道的景况,在2个施用中会存在大气的数据库操作,针对数据库句柄连接数据库的行事,使用单例形式能够幸免大批量的new操作。因为每3次new操作都会消耗系统和内部存款和储蓄器的财富。


而是,PHP在语言等第上尚无章程让有个别对象常驻内部存款和储蓄器。在PHP中,全体的变量都以页面级的,无论是全局变量,可是,在其实应用中同三个页面中或然会设有四个事情逻辑,那时单例形式就起到了很要紧的效应,有效的制止了重复
,即使偶尔会有个别鸡肋。
在不应用单例的意况下大家在1个类里面操作数据库或者是这么的:

<?php
function getUserInfo(){
  $db = new DB(...);
  $db->addUserInfo();
}
function getOneUser($id){
  //多次初始化数据库连接
   $db = new DB(...);
   $db->getUserInfo($id);
}

眼看连接数据库的操作在连接同3个数据库的情景下是适用于具备的,所以在那种景色下单例能大大减弱不需要的能源消耗,大诸多php框架数据库连接都以选取单例情势,以下是运用单例的做法:

<?php
class User{
//私有化的全局实例
static private $_instance = NULL;
/**
 *  私有化构造函数,防止外界实例化对象
*/
private function  __construct() {}
/**
 *  私有化克隆函数,防止外界克隆对象
*/
private function  __clone(){}
/**
 *  静态方法, 单例统一访问入口,如果存在实例返回该实例,否则创建新实例
 *  @return  object  返回对象的唯一实例
*/
static public function getInstance() {
  if (is_null(self::$_instance) || !isset(self::$_instance)) {
  self::$_instance = new self();
  }
  return self::$_instance;
} 
//测试单例
public function getName() {
  echo 'hello world!';
}
}

从而总结如下
一.急需二个保存类的唯1实例的静态成员变量(经常为$_instance私有变量)
二.构造函数和克隆函数必须表明为个人的,这是为着避防外部程序new类从而失去单例形式的含义
3.务必提供三个拜访这么些实例的公物的静态方法(常常为getInstance方法),从而重返唯1实例的三个引用


PHP单例方式的短处
大千世界,PHP语言是壹种解释型的脚本语言,那种运营机制使得各样PHP页面被分解推行后,全体的相干财富都会被回收。相当于说,PHP在语言等第上未有办法让某些对象常驻内部存款和储蓄器,那和asp.net、Java等编写翻译型是见仁见智的,举例在Java中单例会一贯存在于全部应用程序的生命周期里,变量是跨页面级的,真正得以完结那个实例在应用程序生命周期中的唯壹性。但是在PHP中,全体的变量无论是全局变量还是类的静态成员,都以页面级的,每一次页面被实行时,都会再次确立新的目标,都会在页面试行完结后被清空,那样就像PHP单例形式就从未怎么意义了,所以PHP单例格局我认为只是本着单次页面级请求时现身多少个利用场景并索要共享同1对象财富时是十三分有意义的。

主题素材是如此的:

+++++++面试题++++++++++

请用单例设计情势方法设计类满意如下须求:

请用 PHP伍代码编写类落成在历次对数据库连接的拜会中都不得不得到唯1的二个数据库连接,具体连接数据库的详实代码忽略,请写出重大逻辑代码

 

+++++++++++++++++++

单例形式有多少个要点:

1.类的构造函数必须标志为 private(私有) (访问调整:防止外部代码通地new
操作符创设对象) 来能在别的类中实例化,只可以在类自己中进行实例化。

      private fcuntion __construc()

二.拥用三个保存类实例的 私有静态成员变量

  private static $ins ;  //$ins 用来保存那些类的实例

叁.负有3个造访那些类实例的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检查测试到类是或不是早已被实例化) 

4.创建 私有的__clone 方法 ,幸免对象被复制。

 

 为啥这么做吗?

壹、php的接纳关键在于数据库应用, 所以二个利用中会存在大气的数据库操作,
使用单例格局, 则能够免止多量的new 操作消耗的能源。

2、如若系统中须要有3个类来全局调控有些配置音讯,
那么使用单例格局能够很便宜的完毕. 那几个能够参考ZF的FrontController部分。

三、在3遍页面请求中, 便于进行调治,
因为有着的代码(比方数据库操作类db)都汇集在三个类中,
我们可以在类中安装钩子, 输出日志,从而制止随处var_dump, echo。

 

说起底答案代码如下

 

<?php
    class Mysql
    {
        private static $instance = null;
        private $conn;

        // 构造方法,设置为private,不允许通过new获得对象实例
        private function __construct(argument)
        {
            $conn = mysql_connect("localhost","root","root");
        }

        // 获取实例方法
        public static function getInstance()
        {
            if (!self::$instance instanceof self) {
                self::$instance = new self;
            }
            return self::$instance;
        }

        // 禁止克隆
        private function __clone(){}
    }

    // 获得对象
    $db = Mysql::getInstance();
?>
 

再此做一下备忘录。

<?phpclass Mysql
{
privatestatic
$instance = null;
private
$conn; //
构造方法,设置为private,不容许通过new得到对象实例privatefunction __construct(argument)
{
$conn = mysql_connect(“localhost”,”root”,”root”);
} //
获取实例方法publicfunction getInstance()
{
if
(!self::$instance
instanceofself)
{ self::$instance
= newself;
} returnself::$instance;
} //
禁止克隆privatefunction __clone(){}
} //
获得对象
$db = Mysql::getInstance(); ?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图