php实现一个单例模式
单例模式是什么
说的简单点,单例模式就是在使用类创建对象的时候。不管你下面有了多少个new 类
名。
它只会生成一个实例。
具体思路如下:
- 把类中的构造方法前面加上修饰符 private . 作用:如果不让一个类创造对象。我们可以把它的构造函数私有化。
private function __construct(){ //将构造方法私有化 不让它创建对象
}
- 在类中自己定义一个静态方法,在这个方法的里面通过 new 类名 来创造实例 。作用:外面通过类名来调这个方法来创建实例。
static function getObj(){//定义一个方法在方法的里面创造对象
return self::$obj = new self;
}
有人说这样在外面通过类名来调这个方法。不是照样还会是有多个实例吗?…还没完
- 我们还需要在类中定义一个静态的属性给它赋值为null
static $obj = null;
- 在我们定义的静态方法中判断这个静态属性。如果这个静态属性是null我们就创建对象赋值给这个静态属性,否则我们就返回这个类的静态属性
static function getObj(){//定义一个方法在方法的里面创造对象
if(is_null(self::$obj)){
return self::$obj = new self;
}else{
return self::$obj;
}
}
好了。到此我们这个单例模式就创建完了。下面我们可以直接使用类名::getObj()创建实例了!
贴下完整代码
<?php
//单例模式
class Person{
static $obj = null;
private function __construct(){ //将构造方法私有化 不让它创建对象
}
static function getObj(){//定义一个方法在方法的里面创造对象
if(is_null(self::$obj)){
return self::$obj = new self;
}else{
return self::$obj;
}
}
function say(){
echo "aaaaaaaaa<br>";
}
function __destruct(){
echo "######<br>";
}
}
$p1 = Person::getObj();
echo $p1->say();
$p2 = Person::getObj();
$p3 = Person::getObj();
$p3 = Person::getObj();
?>