最近デザイン パターンが普及し、MVC があらゆるところで見られ、PHP 分野でも例外ではありません。PHP での MVC の使用について議論され始めています。しかし、PHP では M、V、C をどのように実装すればよいでしょうか? MVC は本当に PHP に適しているのでしょうか?ここで Easy は独自の考えをいくつか述べています。
MVC プロトタイプ
MVC はもともとデスクトップ プログラムに存在していました。M はデータ モデルを指し、V はユーザー インターフェイスを指し、C はコントローラーを指します。 MVC を使用する目的は、M と V の実装コードを分離し、同じプログラムで異なる表現を使用できるようにすることです。たとえば、統計データのバッチをそれぞれ棒グラフと円グラフで表すことができます。 C の目的は、M と V の同期を確保することです。M が変更されると、V も同期して更新される必要があります。
MVC in JAVA
JAVAはWeb分野にMVCを導入し、これをベースにModel2と呼ばれるシステムが構築されました。 Web の特殊性により、JAVA の MVC とデスクトップの MVC はまったく同じではありません。主な理由は、Web の V は永続的ではなく、ユーザーがアクセスするたびに V を再生成する必要があるため、V は常に M と一致しており、C が同期を制御する必要がないためです。では、JAVA の C は何をしているのでしょうか? JAVA の C は通常、プロセス ステアリングに使用されますが、実際に使用されるのは Dispatch モードであり、Desktop の C ではありません。
PHP の MVC
PHP で JAVA の MVC をそのままコピーすることは不可能です。この問題は主に M に現れます。JAVA では、M はビジネス ロジックやプレゼンテーション ロジックから独立したデータ モデルであり、JAVA Bean がこの役割を果たします。 PHP プロセスはメモリ内に長期間常駐しません。PHP ページの実行が開始されたときにのみ作成され、ページの解釈と実行が終了したときに終了します。このような場合、M を直接実装することはできません。したがって、MVC パターンを実装すると主張するすべての PHP プログラムは、シミュレーションを通じてのみ M を実装できます。実装方法は通常、現在のページの終了前にデータベースまたは Cookie/セッションにデータを保存し、次のページでデータベースまたは Cookie/セッションを通じて M を再構築します。 JAVA の Bean と比較すると、この方法は非常にコストがかかると言えます。メモリにデータを書き込むという元の単純な操作は、サーバーからクライアントまたはデータベースに転送し、再度戻す必要があります。データ モデルを維持するためにこのような大きなオーバーヘッドを使用し、最後にそのモデルをデータベースに戻すよりも、必要に応じてデータベース内のデータを直接更新する方が良いでしょう。
これで、PHP の MVC アーキテクチャは次の図で表すことができます。
それでは、Vを見てみましょう。現在、多くの PHP プログラムは単に何らかのテンプレート技術を使用し、説明に「MVC アーキテクチャの採用」と書いています。実際、大多数の PHP テンプレート プログラムは、MVC が重視する表示ロジックとビジネス ロジックの分離ではなく、HTML と PHP を分離しているだけです。 HTML と PHP が混在するページも MVC の一部にすることができます。表示ロジックとビジネスロジックを分離する方法については、まだ満足のいく解決策がありません。個人的には、http://www.phpe.net/articles/384.shtml の実装計画に同意します。 C に関しては、JAVA に似ており、現在でもステアリングに使用されています。これは、PHP では実際には重要ではありません。
非常にリソースを消費する M + 少し異なる V + 必須の C は、PHP のいわゆる MVC を構成します。
上記の分析に基づいて、Easy は PHP 本来の 3 層アーキテクチャがいわゆる MVC よりも効率的であり、3 層アーキテクチャのプレゼンテーション層が解決する必要がある問題は MVC にも存在すると考えています。改良された 3 層アーキテクチャは、MVC よりも PHP に適しています。
追記: 一部のソリューションは M にビジネス ロジックを組み込んでいます (http://www.phpe.net/articles/382.shtml)。これは実際には MVC の考え方に反しています。
さらに関連するディスカッションについては、ディスカッションエリアにアクセスしてください: http://club.phpe.net/index.php?act=ST&f=15&t=4720