一、对于db类需要连多个数据库是不是不适合或者没法用单例模式?
二、有一个类文件:a.class.php,里面有个A类,一般使用单例的话都是在这个A类里加上getInstance静态方法,同时__construct构造函数设为私有的。但是线上程序都是直接new的A类,这样改了会影响线上跑的程序。于是我想再创建一个c.a.class.php,代码如下:<?php
include("a.class.php");
class CreA{
static private $_instance = NULL;
private function __construct(){}
static public function getInstance() { 
if (is_null(self::$_instance) || !isset(self::$_instance)) {
self::$_instance = new A();
}
return self::$_instance;
}
}
?>对于新的程序要用到a对象的采用CreA::getInstance()单例的方式,请问这种方式是否可行?
三、假如a.class.php这个文件比较大,我在user.class.php里的User类有某几个方法要用到a对象,采用上面的单例模式来调用,那我的c.a.class.php改成如下:<?php
class CreA{
static private $_instance = NULL;
private function __construct(){}
static public function getInstance() { 
if (is_null(self::$_instance) || !isset(self::$_instance)) {
include("a.class.php");
self::$_instance = new A();
}
return self::$_instance;
}
}
?>这样是不是更好,还是和上面那样写没有区别?

解决方案 »

  1.   

    扯淡模式,我一向认为这是php上层函数的底层实现方式。
      

  2.   

    什么叫php上层函数的底层实现方式?
      

  3.   

    一,可以用多个单例,或者改造的单例,或者registry 
    二和三,如果用autoloading的话,可以省掉那句include
    "线上程序都是直接new的A类",如果改动不算太大的话,当然还是改掉好,否则新旧两种方式混用,有可能有麻烦
      

  4.   

    <?php/**
     * 数据库连接工厂类
     *
     * @author Administrator
     * @package defaultPackage
     */
    class DbFactory{
    const CURDATABASE='DataBase';//默认连接Mysql(新增、修改、删除)
    const SELDB='DataBase_Rep';//查询数据库
    const MSSQL='MSSQL';
    public static function &getDbLink($curDataBase='DataBase_Rep'){
    $db_config=nul;
    $conn=null;
    switch ($curDataBase){
    case DbFactory::CURDATABASE:
    $db_config=new Config_ini_file(INI_FILE,DbFactory::CURDATABASE);
    $conn=MySqlDB::getInstance($db_config->DataBase->Db_Host,$db_config->DataBase->Db_Name,$db_config->DataBase->Db_User,$db_config->DataBase->Db_Pwd);
    break;
    case self::SELDB:
    $db_config=new Config_ini_file(INI_FILE,DbFactory::SELDB);
    $conn=MySqlDB::getInstance($db_config->DataBase_Rep->Db_Host,$db_config->DataBase_Rep->Db_Name,$db_config->DataBase_Rep->Db_User,$db_config->DataBase_Rep->Db_Pwd);
    break;
    case self::MSSQL:
    $db_config=new Config_ini_file(INI_FILE,DbFactory::MSSQL);
    $conn=MsSqlDB::getInstance($db_config->MSSQL->Db_Host,$db_config->MSSQL->Db_Name,$db_config->MSSQL->Db_User,$db_config->MSSQL->Db_Pwd);
    break;
    default:
    $db_config=new Config_ini_file(INI_FILE,DbFactory::SELDB);
    $conn=MySqlDB::getInstance($db_config->DataBase_Rep->Db_Host,$db_config->DataBase_Rep->Db_Name,$db_config->DataBase_Rep->Db_User,$db_config->DataBase_Rep->Db_Pwd);
    break;
    }
    return  $conn;
    }
    }
    ?>
      

  5.   

    public static function getInstance($db_host,$db_name,$db_user,$db_pwd){
    if((self::$_instance instanceof self)&&self::$_instance->_host===$db_host&&self::$_instance->_dbname===$db_name&&self::$_instance->_dbuser===$db_user){
    ;
    }else{
    self::$_instance=new self($db_host,$db_name,$db_user,$db_pwd);
    }
    return self::$_instance;
    }