0

複数の場所で使用されるPHP関数(funcAと呼びます)があるので、funcA(およびいくつかの関連関数)をrequire他のPHPファイルにある別のファイルに配置しました。funcAは、すでに開いていて、それを呼び出すコードによって使用されているデータベースに対して多数のクエリを実行します。これらのクエリは、MDB2オブジェクトを介して実行されます。

現在のところ、funcAが呼び出されると、呼び出し元のルーチンは、すでに接続されているMDB2オブジェクトポインターをそれに渡します。これは正常に機能します。

私が疑問に思っているのは、MDB2objectポインターを渡さずに、代わりにfuncA requireMDB2を使用して、独自のmdb2オブジェクトを使用してデータベースに接続することにより、funcAを完全に自己完結型にする方がよいかどうかです。それはより多くのメモリ、より多くのCPUサイクル、そしてより多くのネットワークトラフィックですが、それはより良い習慣ですか?

4

2 に答える 2

1

「ベストプラクティス」は、定義するのがほとんど不可能なことの1つです。ただし、関数が他の何かに依存している私の見解では、現在行っているように、その依存関係を関数に渡すのが最善です。

これにより、関数はデータベースを見つけて接続することを心配することなく、何でも実行できます。また、ダミーデータベースを使用して関数をテストすることもできます。

これは一般に依存性注入として知られており、オブジェクト指向アーキテクチャで広く推奨されています。

于 2011-08-19T13:54:12.363 に答える
1

それを悪い習慣と呼ぶ人もいるかもしれませんが、この状況での解決策は、レジストリパターンまたはシングルトンPDOクラスである可能性があります。

シングルトンやレジストリの正誤について全体的な議論を始めたくはありませんが、この場合、アプリケーションの大部分をリファクタリングする必要のない最もクリーンなソリューションである可能性があります。


いくつかの本当に基本的な例(これらのパターンを理解すると時間と手間を大幅に節約できるため、上記のリンクをよく読んでください)

// Singleton class MyPDO
// This assumes you have a singleton class extending PDO somewhere included or required
function funcA(){
    $database = MyPDO::getInstance();
    // ...
}

// Registry pattern
// This assumes that somewhere during your bootstrapping you create an 
// instance of PDO and store it in the registry so you can retrieve it 
// anywhere else later
function funcA(){
    $database = Registry::get('Database');
    // ...
}
于 2011-08-19T13:50:52.617 に答える