PHPベースのオブジェクト指向プロジェクトで、データベースエンジン、ユーザー通知、エラー処理などのヘルパーオブジェクトをどのように整理して管理しますか?
大規模なPHP CMSがあるとします。CMSはさまざまなクラスで構成されています。いくつかの例:
- データベースオブジェクト
- ユーザー管理
- アイテムを作成/変更/削除するためのAPI
- エンドユーザーにメッセージを表示するメッセージングオブジェクト
- 正しいページに移動するコンテキストハンドラ
- ボタンを表示するナビゲーションバークラス
- ロギングオブジェクト
- おそらく、カスタムエラー処理
等
私は、これらのオブジェクトを必要とするシステムの各部分がこれらのオブジェクトにアクセスしやすくするための永遠の質問に取り組んでいます。
何年も前の私の最初のアプローチは、これらのクラスの初期化されたインスタンスを含む$ applicationグローバルを持つことでした。
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
次に、シングルトンパターンとファクトリー関数に切り替えました。
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
しかし、私もそのことに満足していません。ユニットテストとカプセル化は私にとってますます重要になり、私の理解では、グローバル/シングルトンの背後にあるロジックはOOPの基本的な考え方を破壊します。
それからもちろん、各オブジェクトに必要なヘルパーオブジェクトへのポインターの数を与える可能性があります。おそらく最もクリーンで、リソースを節約し、テストしやすい方法ですが、長期的にはこれの保守性に疑問があります。
私が調べたほとんどのPHPフレームワークは、シングルトンパターン、または初期化されたオブジェクトにアクセスする関数を使用しています。どちらもすばらしいアプローチですが、先ほど述べたように、どちらにも満足しています。
ここにどのような一般的なパターンが存在するかについて、視野を広げたいと思います。私はからこれを議論するリソースへの例、追加のアイデアやポインタを探しています長期的、現実世界の視点。
また、この問題に対する専門的でニッチなまたは奇妙なアプローチについても興味を持っています。
$mh=&factory("messageHandler");
は無意味であり、パフォーマンス上の利点はありません。また、これは5.3で廃止されました。