单例

来源:互联网 发布:2017年最污的网络热词 编辑:程序博客网 时间:2024/04/30 09:15

// 创建一个单例模式的mysql类


/*
所用知识点:
构造函数
权限修饰符
静态属性


对象克隆
final类
*/


// 单例第1步,先写一个普通的类
/*
class mysql {
    private $id;

    public function __construct() {
        $this->id = rand(1,10000);
    }
}


$m1 = new mysql();
$m2 = new mysql();
*/

 

// 单例第2步,写一个不允许new的类
/*
class mysql {
    private $id;

    protected function __construct() {
        $this->id = rand(1,10000);
    }
   
}


$m1 = new mysql();
*/

 

// 单例第3步, 开放一个静态,公共的接口, 来从内部new得到实例
/*
class mysql {
    private $id;

    protected function __construct() {
        $this->id = rand(1,10000);
    }

    public static function getIns() {
        return new self();
    }
}


$m1 = mysql::getIns();
$m2 = mysql::getIns();

print_r($m1);
print_r($m2);

if($m1 === $m2) {
    echo '是一个对象';
} else {
    echo '不是一个';
}
*/

 

// 单例第4步, getIns加一个判断,
// 如果不存在,则new一个实例,并保存该实例,然后return 该实例.
// 如果已经存在实例,则直接return该实例,
// 该实在存放在哪儿?

 

class mysql {
    private $id;
    private static $ins = false;
   
    public $age = 22;
   
    protected function __construct() {
        $this->id = rand(1,10000);
    }

    public static function getIns() {
        // return new self();
        if(self::$ins === false) {
            self::$ins = new self();
        }

        return self::$ins;
    }
}


$m1 = mysql::getIns();
$m2 = mysql::getIns();

$m3 = $m2; // 由于 对象的引用传值特性

/*
print_r($m1);
print_r($m2);
print_r($m3);

if($m1 === $m3) {
    echo '是一个对象';
} else {
    echo '不是一个';
}

*/

 

// 接下来,破解单例的特性
// 用克隆和继承,都能够使单例失效
// 解决: 预习魔术方法__clone, final关键字


/*
$m4 = clone $m3;

if($m1 === $m4) {
    echo '是一个对象';
} else {
    echo '不是一个';
}

 

class db extends mysql {
    private $id;
    public function __construct() {
        $this->id = rand(1,1000);
    }
}


$db1 = new db();
$db2 = new db();

print_r($db1);
print_r($db2);

if($db1 === $db2) {
    echo '是一个对象';
} else {
    echo '不是一个';
}
*/

原创粉丝点击