欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP设计模式(一)

程序员文章站 2022-04-17 11:50:10
...
在码PHP程序的时候,为了以后更好地维护代码和理解代码,用一些合适的设计模式是必不可少的,下面我和大家首先分享下单例模式,有错误或者不恰当的地方,还望PHPer们帮我指出。
  • 单例模式

PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,因此PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:

1. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;

2. 同样要屏蔽__clone()方法,防止从类外部进行克隆

2. 然后就是定义一个用来保存实例的私有变量和获取私有变量的公有函数getInstance()。

php
/**
 * 设计模式——单例模式
 * @author 燕睿涛(luluyrt@163.com)
 */
class Singlemodel{
    /**
     * 保存Singlemodel实例的变量
     * @var Singlemodel $_instance
     */
    private static $_instance = null;
    
    /**
     * 屏蔽掉通过new来实例化该对象
     */
    private function __construct(){
    //空函数就行
    }
    /**
     * 屏蔽掉通过clone来克隆该对象
*/ 
    private function __clone(){ 
//空函数就行 
    } 
    /**
     * 通过该方法获取实例,防止多次实例化
     */
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance = new self();
           }
        return self::$_instance;
    }
    
}

空口无凭,光说这些理论的没有说服力,下面通过例子来看下具体的效果差异

php
/**
 * 设计模式——单例模式——测试
 * @author 燕睿涛(luluyrt@163.com)
 */
class Singlemodel{
    /**
     * 保存Singlemodel实例的变量
     * @var Singlemodel $_instance
     */
    private static $_instance = null;
    
    private $_link = null;
    /**
     * 屏蔽掉通过new来实例化该对象(也可以去掉)
     * 这里来测试数据库连接
     */
    private function __construct(){
        $this->_link = mysqli_connect("localhost","root","","mysql");
    }
 
    /**
     * 通过该方法获取实例,防止多次实例化
     */
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance = new self();
           }
        return self::$_instance;
    }
 
    /**
     * 测试1,通过使用单例模式
     */
    public static function testOne(){
        return self::getInstance();
    }
 
    /**
     * 测试1,通过使用单例模式
     */
    public static function testTwo(){
        return new self();
    }
    
}
$obj = array();
$begin = microtime(true);
for($i=0;$i$i