【问题标题】:Reuse MySQL connection PHP object inheritance重用 MySQL 连接 PHP 对象继承
【发布时间】:2012-10-27 09:58:57
【问题描述】:

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

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

我将两个论坛都托管在同一主机上 - 本地主机

我的脚本结构如下

<?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();  

【问题讨论】:

  • 这不是“OOP”,只是namespaced procedural code。无论如何,你有很多问题,对你来说真正的挂断是什么?为什么不能实例化 mysqli 连接并将其传递给您的方法?
  • 如何区分新旧?
  • 嗨@deceze,谢谢,现在改写我的问题。我打算在 OldForum 和 NewForum 类中将数据库名称设置为 1 常量,这会不会非常错误?
  • 现在正在阅读您的参考资料,顺便说一句,@deceze

标签: php mysql mysqli


【解决方案1】:

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 方法提取到它们自己的类中,然后使用某种 Composite Command Pattern,但这实际上取决于您需要的模块化程度。

【讨论】:

  • 您意识到根本不需要 3 个类 :D 我需要 PHP 或其他服务器端脚本语言,因为旧论坛的数据库结构与新论坛不同。目前我还不清楚 boostrapping 的概念,但我绝对知道如何从这里开始。也将阅读引导程序。干杯,@Gordon!
【解决方案2】:

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

CREATE VIEW old_tbl_name AS
     SELECT *
       FROM old_forum.tbl_name

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

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2015-12-16
    • 2014-12-24
    相关资源
    最近更新 更多