学习任何知识,都应当尝试带着问题去学。
----路漫漫
它是干嘛的?
在项目中,保证我们使用的对象是同一个
提个问题 : $db1 = new Mysql();$db2 = new Mysql();
这两个对象是一个么?
什么情况用它?
一般的web项目中,数据库一般就一个,这时我们当然希望在项目里只存在一个数据库对象。当我们在不同地方new mysql()
对象时,你得到这个mysql对象却不是一个!我怎么知道的?看代码
class Mysql{}
$db1 = new Mysql();
$db2 = new Mysql();
if($db1 === $db2){
echo 1;
}else{
echo 0;
}
//运行看看你就知道喽
怎么写呢?
- 把new的权限回收到内部,一定是private
class Mysql { private function __construct() { } } //你还new的出来么?
- 开放一个获取对象接口
class Mysql { protected static $obj = null; private function __construct() { } public static function Ins(){ if (self::$obj===null){ self::$obj = new self(); } return self::$obj; } } //现在new控制权已经牢牢控制在我们手里了
- 你以为这就完了?别忘还有克隆!
class Mysql { protected static $obj = null; private function __construct() { } //单例目的就是统一管理对象,所以直接关闭clone就好 //想要对象?去找Ins() private function __clone() { } public static function Ins(){ if (self::$obj===null){ self::$obj = new self(); } return self::$obj; } }