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 クラスのコンストラクター内で、またはクラス Forum のプロパティとして新しい mysqli オブジェクトを
使用して、MySQL 接続を開始する新しい Forum オブジェクトを作成します。

$a_forum = new Forum();  
4

2 に答える 2

2

mysqli 接続は、ブートストラップ ファイルで一度作成し、それを必要とするインスタンスに渡すことで、インスタンス間で簡単に共有できます。

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

これにより、接続が1つに効果的に制限され、オブジェクト内のグローバルに頼る必要がなくなります。これは依存性注入と呼ばれ、依存性をオブジェクトに割り当てるための推奨される方法です。これにより、依存関係が明示的になり、スワップアウトが容易になるため、変更、テスト、およびメンテナンスにメリットがあります。

インポートおよびエクスポート タスクに関しては、なぜ 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 メソッドを独自の Classes に抽出してから、ある種のComposite Command Patternを使用できますが、それは、これをどの程度モジュール化する必要があるかによって異なります。

于 2012-11-08T08:05:46.327 に答える
1

別のアプローチはVIEW、old_forum データベースを指す new_forums データベースにいくつかを作成することです。この場合、すべての「ビュー」に「old_」プレフィックスなどを付けることができますか? これに似たもの:

CREATE VIEW old_tbl_name AS
     SELECT *
       FROM old_forum.tbl_name

このような状況では、1 つのデータベースへの接続は 1 つしかありません。

于 2012-11-07T12:52:44.867 に答える