class Single
{privatestatic$_instance;privatestatic$db;//构造函数声明为private,防止直接创建对象privatefunction__construct(){self::$db="被实例化了".rand(1,999999);}privatefunction__clone(){trigger_error('Clone is not allow',E_USER_ERROR);}publicstaticfunctiongetInstance(){var_dump(isset(self::$_instance));var_dump(self::$db);if(!isset(self::$_instance)){//如果已经new 实例化过,直接返回实例化的结果。self::$_instance=newSingle();}returnself::$_instance;}functiontest(){echo'test'.rand(1,999999);}}//$sign = new Single(); //报错 因为__construct 为私有$n1=Single::getInstance();$n1=Single::getInstance();$n1=Single::getInstance();$n1->test();$n1->test();$n1->test();//clone $n1;//bool(false)//被实例化了//bool(true)//第一次被实例化之后 后续不再被实例化
class mysql
{//这里使用单例privatestatic$_instance;privatefunction__clone(){}privatefunction__construct(){echo"我正在使用mysql";}publicstaticfunctiongetInstance(){if(!isset(self::$_instance)){self::$_instance=newmysql();}returnself::$_instance;}}classsqlserver{}classoracle{}classDatabase{publicstaticfunctiongetInstance($newclass){$class=$newclass;//真实项目中这里常常是用来解析路由,加载文件。return$class::getInstance();}}//定义每个类的类名constA='mysql';constB='sqlserver';constC='oracle';//调用方法:$return=Database::getInstance('mysql');var_dump($return);
3.注册树模式
注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法
class mysql
{//这里使用单例privatestatic$_instance;privatefunction__clone(){}privatefunction__construct(){echo"我正在使用mysql";}publicstaticfunctiongetInstance(){if(!isset(self::$_instance)){self::$_instance=newmysql();}returnself::$_instance;}}classsqlserver{}classoracle{}classDatabase{publicstaticfunctiongetInstance($newclass){$class=$newclass;//真实项目中这里常常是用来解析路由,加载文件。return$class::getInstance();}}classRegister{protectedstatic$obj;publicstaticfunctionset($name,$obj){self::$obj[$name]=$obj;}publicstaticfunctionget($name){returnself::$obj[$name];}publicstaticfunction_unset($name){unset(self::$obj[$name]);}}//定义每个类的类名constA='mysql';constB='sqlserver';constC='oracle';//调用注册Register::set('mysqldb',Database::getInstance(A));$db=Register::get('mysqldb');var_dump($db);