/*
# 单例设计模式
*/


class multiObj{
    public function __construct(){
        echo " DataBase Linked <br />";
    }
    public function select(){
        echo "select *";
    }
}

$obj1 = new multiObj(); # 生成 Obj#1
$obj2 = new multiObj(); # 生成 Obj#2
$obj3 = new multiObj(); # 生成 Obj#3
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);



/* 单例设计模式,可以防止类被多次的实例化 */

class singleObj{
        static $obj = null; # 用来标记实例,默认不存在
        private function __construct(){
            echo "<br />DataBase Linked<br/>";
        }
        static function getObj(){
            if(is_null(self::$obj)){  # 判断实例是否存在
               self::$obj = new self(); 
               #不存在则实例化类生成实例 , singleObj()换成self()
            }
             return self::$obj;  # 存在实例,直接返回实例
        }
        public function select(){
            echo "select *";
        }
}

$sobj1 = singleObj::getObj(); # 不存在实例 生成Obj #4
$sobj2 = singleObj::getObj(); # 存在实例 返回Obj #4
$sobj3 = singleObj::getObj(); # 存在实例 返回Obj #4
var_dump($sobj1);
var_dump($sobj2);
var_dump($sobj3);

为了防止对象从外部克隆时生成重复对象,还应当增加一个private function __clone(){}方法。
基本上,要实现单例模式,需要禁用构造方法和克隆方法,禁用的方法也很简单,只要加上private 修饰即可。

标签: php, OOP

分享到: