繁体   English   中英

重用MySQL连接PHP对象继承

[英]Reuse MySQL connection PHP object inheritance

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

  • 旧论坛网站使用数据库“old_forums”
  • 新的论坛网站使用数据库“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的属性
这样我就可以创建一个新的Forum对象来启动MySQL连接

$a_forum = new Forum();  

通过在引导程序文件中创建一次,然后将其传递给需要它的实例,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 
    }
}

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

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

CREATE VIEW old_tbl_name AS
     SELECT *
       FROM old_forum.tbl_name

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM