读书对于智慧,也像体操对于身体一样。 --爱迪生
普通单例
几天前,我在谈&
的时候,说到单例的问题,其实在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
中的成员属性obj
和classNameA
中funNameA
函数返回的对象是同一个对象,至于为什么,好好想想啦~ _
最后说两句:一切在于总结和灵活运用,效率就像海绵里的水,挤挤会有的!O(∩_∩)O
本文由 陌上花开 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 8, 2016 at 01:13 am