gpt4 book ai didi

php - 复用 MySQL 连接 PHP 对象继承

转载 作者:可可西里 更新时间:2023-11-01 07:35:35 26 4
gpt4 key购买 nike

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

  • 旧论坛站点使用数据库“old_forums”
  • 新论坛站点使用数据库“new_forums”
  • MySQL 用户“forums”拥有两个数据库的所有权限(为方便起见,我使用 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();  

最佳答案

mysqli 连接很容易在实例之间共享,方法是在引导文件中创建一次,然后将其传递给需要它的实例,例如

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

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

至于您的导入和导出任务,我想知道您为什么要在 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 ,但这实际上取决于您需要它的模块化程度。

关于php - 复用 MySQL 连接 PHP 对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13268143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com