私はこれについてたくさんの質問があることを知っています.私はかなりの量の読書をしました. 私のプロジェクトの文脈でこれを尋ねて、あなたが持っているかもしれない提案を確認したいと思います.
私は、ユーザーや記事(メインクラスと見なす)などの多くのクラスと、画像やコメントなどの小さなクラスを持つ非常に大きなWebアプリケーションを持っています。ページ上で、たとえばarticleとしましょう。画像やコメントの多くのインスタンスが含まれている可能性があります。理にかなっていますよね?たとえば、記事ページで、記事オブジェクトの配列を返す静的メソッドを呼び出します。
それが背景なので、ここで質問です。
大量のアプリを構築して以来、設定と共有機能を含むコア システム クラスが非常に役立つことに気付きました。そこで、すべてのクラスを新しいコア クラスで拡張しました。実装は比較的単純で迅速に行えるように思われました。CodeIgniter が同様のことを行うことは知っています。私のアプリは少し乱雑になっていますが、今は感じています。
質問これは良い考えですか? コアのインスタンスを作成することは、記事のインスタンスを呼び出すときにまさに必要ですが、静的メソッドを使用して複数のインスタンスを作成したり、ページ上の複数の画像やコメントを呼び出したりする場合はどうでしょう。コアクラスを不必要に呼んでいますか?実際には、ページごとに 1 回だけ呼び出す必要があります (たとえば、コンストラクターはデータベースからさまざまな設定を定義します。これは毎回したくありません。明らかにページごとに 1 回だけです) が、すべてのクラスのすべてのインスタンスがそれにアクセスできる必要があります。コアクラス。シングルトン アプローチが必要なように聞こえますが、PHP では時間の無駄であることはわかっています。
この時点で私のコードがどのように見えるかを以下に示します。できるだけシンプルにしようとしました。
class core {
public function __construct(){
...define some settings which are retrieve from the database
}
public function usefulFunction(){
}
}
class user extends core {
public function __construct(){
parent::__construct();
}
public function getUser($user_id){
$db = new database();
$user = /* Get user in assoc array from db */
$this->__setAll($user);
}
public static function getUsers(){
$db = new database();
$users = /* Get users from database in assoc array from db */
foreach($users as $user) {
$arrUsers[] = new self();
$arrUsers[]->__setAll($user);
}
return $arrUsers;
}
private function __setAll($attributes) {
foreach($attributes as $key => $value)
{
$this->__set($key, $value);
}
}
public function __set($key, $value) {
$this->$key = $value;
}
}
私が抱えているもう1つの問題は、データベース接続を効率的に使用/共有することです。現在、データベース接続を必要とするクラスの各メソッドは、データベースの新しいインスタンスを作成するため、1 つのページでこれを 5 回または 10 回行う可能性があります。依存性注入の原則のようなものは、はるかに優れています。
質問DB のインスタンスを新しいユーザー クラスに渡す場合、次のようなものが必要であることがわかります...
class user{
protected $db;
public function __construct($db){
$this->db = $db;
}
... etc
}
$db = new database();
$user = new user($db);
...しかし、静的関数 users::getUsers() を実行したい場合、データベースインスタンスにアクセスする最良の方法は何ですか? 各静的メソッドで変数として渡す必要がありますか? (多くのクラスには多くの静的メソッドがあります)。最善の方法とは思えませんが、別の方法はないかもしれません。
質問パート 1 で提案されているように、すべてのクラスをコア クラスから拡張する場合、そこで DB のインスタンスを作成し、何らかの方法でそれにアクセスできますか?
質問ヘルパー ファイルのような関数 (oop ではない) を含むさまざまなファイルもあります。これらがデータベースにアクセスするための最良の方法は何ですか? 繰り返しますが、各関数で新しいインスタンスを作成しています。私は本当にデータベースをパラメーターとしてそれぞれに渡したくありません。グローバルを使用し、これらのヘルパー ファイルをクラスに変換し、依存性注入または別のものを一緒に使用する必要がありますか?
そこにはたくさんのアドバイスがあることは知っていますが、PHPに関するほとんどの情報とチュートリアルは古く、これほど複雑なことをカバーしていないようです...複雑と呼ぶことができますか?
クラス構造を最適にレイアウトする方法に関する提案。これは大変なことのように思えますが、ほとんどの開発者が毎日直面していることです。さらに情報が必要な場合は、私に知らせてください。読んでくれてありがとう!