单例模式下的对象重连机制
使用单例模式下的类,有异常或者出现问题时,所以的旧连接自然就失效了
所以当出现了这些情况,我们还拿着旧的连接去操作,当然就报错了,但碰到这个错误,我们直接抛异常也不太合理,因为我们可以通过断线重连的机制,重新建立一个新的连接,实现也非常简单
实例代码块
class a{
//静态方法全局变量
private static $_instance = NULL;
public static function getInstance(){
//判断静态变量是否是null
if (is_null(self::$_instance)) {
//定义静态变量,static()返回当前类名
self::$_instance=new static();
}
return self::$_instance;
}
public function test(){
return 'test';
}
}
class b{
private $con;
private $test;
public function __construct()
{
$this->con=a::getInstance();
}
/**
* 重连机制
* __call方法当调用不存在的方法时,会调用类里面的__call方法
* __call方法($name指的是调用方法的方法名,$param指的是调用方法所用的参数),这次调用的函数名和参数列表传进去
* method_exists方法判断函数名是否在$name中,也就是调用方法的方法名
* call_user_func_array 接受两个数组作为参数,第一个数组有两个参数,即要调用的类的名称(或类的实例)和要调用的方法名,第二个参数即是要传递给该方法的参数列表
* @param $name
* @param $param
* @return mixed
*/
public function __call($name, $param){
if(method_exists($this->con,$name)){
return call_user_func_array([$this->con,$name],$param);
}else{
echo 77;
}
}
public function connect()
{
//初始的变量$test为null
if($this->test==null){
//调用本类不存在的方法test(),会调至__call方法
//实际中当无法实例化其他类或者调用其他类静态方法,也属于调用不存在的方法,会调至__call方法,赋值给$test变量
$this->test= $this->con->test();
}
print_r($this->test);
}
}
$a=new b();
$a->connect();