【原】大话PHP中单例的应用
in 随笔 with 0 comment

【原】大话PHP中单例的应用

in 随笔 with 0 comment

读书对于智慧,也像体操对于身体一样。 --爱迪生

普通单例

几天前,我在谈&的时候,说到单例的问题,其实在PHP中,单例是有明确的规定的,很明白的定义,其大概的demo如下:

<?php
class className {
    static private $handle = null;
    private function __construct( $param ){
        
    }
    static public function getInstance($param){
        if (self::$handle == null) {
            self::$handle = new self( $param );
        }
        return self::$handle;
    }

    public function addHonour( $num ){
        
    }
}

大概的意思就是,你不可以直接实例化这个类,因为构造函数是私有函数,只可以通过静态方法getInstance来实例化这个类,凑巧的是,这个类的实例化对象又被赋给了一个静态变量,只有这个静态变量不存在的时候才会实例化,所以,我们可以确保这个对象在一个进程中不管被调用多少次,永远只会实例化一次。

巧用单例

其实这种方式根本就不能算是单例,只不过借用了单例的概念,用以实现优化数据库操作的目的,具体的请看下方代码:

<?php
class className {
    static private $data = [];
    static public function init( $hid = '' ){
        if( empty( self::$data[$hid] ) ){
           //查询数据库
           self::$data[$hid] = '*****';
        }
    }
    static public function increment() {
        $hid = self::init( $hid );
        //.......
    }
    static public function save(){
        if( !empty(self::$data) ){
            //保存数据库
        }
    }
}

在单入口的PHP框架中,或者依照单入口模式设计的项目中,我们只需要在第一次初始化这个类的时候,找到需要的数据对象,然后不管我们在当前进程中对这个对象进行多少次的操作,永远都是在第一次调用的时候查一次数据库,之后的所有的操作均在内存中以数组的形式运算操作,然后在单入口的出口处调用save将内存中数据,保存到数据库即可。

不用静态变量的单例

方法也是我们之前提出过的,用&来实现,具体还是看一个demo吧。

<?php
class classNameA{
    public static function &funNameA() {
        return $Object;
    }
}

class classNameB{
    public function __construct($action = null) {
        $this->obj = &classNameA::funNameA();
    }
}

这里的classNameB中的成员属性objclassNameAfunNameA函数返回的对象是同一个对象,至于为什么,好好想想啦~ _

最后说两句:一切在于总结和灵活运用,效率就像海绵里的水,挤挤会有的!O(∩_∩)O

Comments are closed.