重用MySQL连接PHP对象继承

时间:2012-11-07 10:50:20

标签: php mysql mysqli

我正在编写一个PHP脚本,用于将主题从旧论坛站点迁移到新论坛站点。

  • 旧论坛网站使用数据库“old_forums”
  • Thew新论坛网站使用数据库“new_forums”
  • MySQL用户“论坛”拥有两个数据库的所有权限(为方便起见,我使用的是单个用户,但如果需要,我会使用2个不同的用户时遇到任何问题)

我将两个论坛托管在同一主机上 - localhost

脚本我有以下结构

<?php  
class Forum {  
   //constants  
   const HOST = "localhost";  
   const DB_USER = "forums";  
   const DB_PASS = "forums";  
   ...  
   //properties e.g. topic title, topic content
}
class OldForum extends Forum {  
   const DB_NAME_OLD = "old_forums";  
   public static function exportTopics() {  
       //some code
   }  
}
class NewForum extends Forum {
   const DB_NAME_NEW = "new_forums";
   public static function importTopics() {  
       //some code
   }
}  
OldForum::exportTopics();  
NewForum::importTopics();  
?>   

据我所知,我正在混合程序和面向对象编程PHP(OOPP)在这里。 我是面向对象PHP的新手,但是(我有Java经验,所以我非常愿意接受一些指导来制作这个纯粹的OOPP)

我想为OldForum和NewForum类提供1个单独的MySQL连接 我应该在哪里实例化mysqli对象?
例如在Forum类的构造函数中或者有一个新的mysqli对象作为类论坛的属性 这样我就可以创建一个新的Forum对象来启动MySQL连接

$a_forum = new Forum();  

2 个答案:

答案 0 :(得分:2)

mysqli连接很容易通过在引导文件中创建一次然后将其传递给需要它的实例来共享实例,例如。

$mysqli = new mysqli(/* connection params */);
$someClassUsingMySqli = new SomeClassUsingMySqli($mysqli);
$anotherClassUsingMySqli= new AnotherClassUsingMySqli($mysqli);

这将有效地限制连接到一个,你不需要求助于对象内的全局变量。这称为依赖注入,应该是您为对象分配依赖关系的首选方式。它使依赖关系明确且易于更换,从而有利于变更,测试和维护。

至于你的导入和导出任务,我想知道你为什么要在PHP中这样做。它显然是相同的数据库服务器,因此您可以在MySql实例中执行此操作。如果你想用PHP做,我可能会做这样的事情:

class MigrateForum
{
    private $dbConnector;

    public function __construct(DBConnector $dbConnector)
    {
        $this->dbConnector = $dbConnector;
    }

    public function migrate()
    {
        // orchestrate the migration (consider transactions)
        $this->exportOldForum();
        $this->importNewForum();
    }

    private function exportOldForum()
    {
        // code to export old_database_name.table_name 
    }

    private function importOldForum()
    {
        // code to import new_database_name.table_name 
    }
}

您可以将导入和导出方法提取到他们自己的类中,然后使用某种Composite Command Pattern,但这实际上取决于您需要的模块化程度。

答案 1 :(得分:1)

不同的方法是在new_forums数据库中创建一些指向old_forum数据库的VIEW。在这种情况下,所有“视图”可能都有,例如,“old_”前缀?类似的东西:

CREATE VIEW old_tbl_name AS
     SELECT *
       FROM old_forum.tbl_name

在这种情况下,您只能与一个数据库建立一个连接。