4

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

  • 旧论坛站点使用数据库“old_forums”
  • Thew 新论坛站点使用数据库“new_forums”
  • MySQL 用户“论坛”拥有两个数据库的所有权限(为方便起见,我使用 1 个单用户,但如果需要,使用 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 类的属性,
这样我就可以创建一个新的 Forum 对象来启动 MySQL 连接

$a_forum = new Forum();  
4

2 回答 2

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 
    }
}

您可以将 Import 和 Export 方法提取到它们自己的类中,然后使用某种复合 命令模式,但这实际上取决于您需要的模块化程度。

于 2012-11-08T08:05:46.327 回答
1

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

CREATE VIEW old_tbl_name AS
     SELECT *
       FROM old_forum.tbl_name

在这种情况下,您只有一个与一个数据库的连接。

于 2012-11-07T12:52:44.867 回答