单例模式
使用场景:
当两个模块只需要使用一个对象来进行通信,并且该对象不能被覆盖(即只要该对象只能生成一个实例,且无论调用多少次都是这一个实例并且无法被覆盖),这是就需要使用到单例模式。
关键点:
1.用来通信的对象不能被覆盖
2.谁都可以使用这个对象来传递数据
实例:
要创建一个这样的类,有几点需要思考
1.该类不能被直接在类外实例化,直接实例化会导致实例化出多个实例。由此可以想到必须将构造函数私有化才可以在类内实现实例化
2.该类只能被实例化一次,这说明在调用该类第一次的时候就会实例化,第二次不会被实例化。这时就需要一个私有的成员变量来存储该类的实例,通过判断该成员变量是否为空来控制是否为第一次实例化。
3.可以增加一些私有的成员变量用来存储其他模块通信时所需要传输的数据。
4.私有的成员变量在类外部不能直接操作,因此需要创建get和set方法用来获取和存放信息;
<?php class SingleInstance{ private $price; private static $instance; private function __construct(){ } public static function getInstance(){ if (empty(static::$instance)) { static::$instance=new SingleInstance(); } return static::$instance; } public function getPrice(){ return $this->price; } public function setPrice($price){ $this->price=$price; } } $single=SingleInstance::getInstance(); $single->setPrice(20); echo $single->getPrice(),PHP_EOL;//结果 20 unset ($single);//在此处将其销毁 $single2=SingleInstance::getInstance(); echo $single2->getprice();//再次实例化,发现结果仍是20