**单例模式设计(三私一公)**
1. 私有的静态的保存对象的属性
2. 私有的构造方法 阻止类外new对象
3. 私有的克隆方法阻止类外克隆对象
4. 唯一创建对象的入口就是通过一个共有的静态方法
**作用**:减少内存消耗,如数据库操作时多次`new`数据库对象会造成数据库的重复连接与销毁消耗大量的内存资源,通过单例模式我们就可以达到只实例化一次数据库对象。
如下创建一个单例的数据库类
```php
Class Mysql{
//私有静态对象属性
private static $obj = NULL;
//私有构造方法防止外部new对象
private function __construct(){}
//私有克隆方法,防止外部通过克隆创建对象
private function __clone(){}
//提供一个唯一的创建对象的方法
public static function getInstance(){
//判断当前对象是否被创建
if(!self::$obj instanceof self){
//如果对象不存在则创建
self::$obj = new self
}
return self::$obj;
}
}
$mysql = Mysql::getInstance();//创建mysql对象
```
instanceof用于判对象是否是某个类的实例
如
```php
function myload($class){
require ('./'.$class.'.class.php');
}
spl_autoload_register('myload');
class Db extends Mysql {
}
$db = new Mysql();
$db->test();
if ($db instanceof Db){
echo "由Db类创建";
}else{
echo "非Db类创建";
}
//非Db类创建
```
这样做有什么好处?
上面说到可以减少内存消耗。
除此之外你想没有,这是一个数据库操作类,不可能我们每一次进行数据库操作都实例化一次,而每次实例化的对象都是不同的,这样会不会产生未知问题?
> 单例在系统中只存在一个对象实例,因此任何地方使用此对象都是一个对象避免多实例创建使用时产生的逻辑错误