单例设计模式:
/*
单例设计模式:单例就是一个仅有一个实例(只能得到一个对象)
问题:
1:每一个new都会得到一个新对象,每一次得到新对象,构造方法就会被执行一次
解决方法:不能让类在外边随便new,把构造方法进行私有化
2:在类外不能new了,那么这个类就不能被实例化,构造方法不执行了
解决方法:在类内定义一个方法,在这个方法里去new这个类
3:由于在类外没有对象,所以没有办法访问到into方法
解决方法:让into方法变成静态的,然后通过范围运算符使用类里边的 into方法
4:在类外不能new了,但是可以在类外使用范围运算符多次new(在类外多次访问into方法)
解决方法:在类里设置一个成员属性,用于存储在类内得到的对象
5:由于没有对象的产生,所以$this无法使用
解决方法:把成员属性变成静态的,然后在静态的方法中使用范围运算符访问静态的成员属性
*/
class Model{
public $link;
static public $tabName;
static public $obj=null;
//构造方法:在new对象的时候自动调用
private function __construct(){
echo "连接了一次数据库";
}
static public function into($tabName){
Model::$tabName=$tabName;
if(is_null(Model::$obj)){
Model::$obj=new Model;
}
return Model::$obj;//你们都承认了,它是对象
}
public function select(){
$tabName=Model::$tabName;
$sql="select * from {$tabName}";
echo $sql;
}
}
/*
$user=new Model();
$type=new Model;
$goods=new Model;
*/
//Model::into('goods');
$user=Model::into('user');//对象
//访问类里边的方法 对象->方法名
$user->select();
$type=Model::into('type');
$type->select();
1. new test(); //通过new实例化对象
2. 通过clone复制对象
3. 通过序列化反序列化得到对象实例
4. 通过类的反射实例化对象
如何阻止这种实例化实现理想的单例模式
1. new test();//通过new实例化对象: 通过更改构造方法为private 阻止使用方直接new 对象
2. 通过clone复制对象 : 通过定义private __clone()阻止复制操作
3. 通过序列化反序列化得到对象实例 :通过定义__wakeup()阻止对象的反序列化。
4. 通过类的反射实例化对象:暂时还没有相应的方法去阻止使用此方法实现对象多例
例化对象:暂时还没有相应的方法去阻止使用此方法实现对象多例
单例模式有三个特点:
1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例
PHP单例设计模式
最新推荐文章于 2024-07-29 02:04:26 发布