ホームページ >バックエンド開発 >PHPチュートリアル >PHP コード設計構造に関する簡単な説明_PHP チュートリアル
長年コーディングをしていると、あらゆる種類のコードが日夜付きまといます。コードとどのように友好的に付き合っていくかは、キャリアを反映するだけでなく、ライターのスキルを直接表現するものでもあります。
プログラムやコードについてどのように考えていますか?
それでは、プログラム定義から始めましょう
ビジネスの最終的なプレゼンテーションから、プログラムは実際のビジネス要件の論理コード マッピングとして見ることができます。
プログラムの論理構造を見ると、プログラムはデータ構造とアルゴリズムの組み合わせです。
このように考えると、より多くのビジネス ニーズを満たし、これらのニーズをより適切に満たすためには、より多くのプログラム コードが必要になります。
プログラムコードの蓄積が一定量に達すると、既存のコードをどのように管理・整理するかが重要な課題となります。これは、プログラミングを 3 ~ 5 年続けたプログラマが中級レベルからより高いレベルに進む際のボトルネックでもあります。
ニーズを満たすときに機能するコードは優れていますが、複数のニーズで再利用できるコードはさらに優れています。
ソフトウェア設計の発展に伴い、コード収集と機能ロジックの蓄積とカプセル化の傾向がますます明らかになってきました。
ツールを上手に使うのは簡単ですが、設計のアイデアを習得するには、継続的な実験と改善が必要です。
データの処理に特化したコードと、プレゼンテーションの処理に特化したコードがあり、それらをビジネス プロセスで管理および構成するにはどうすればよいでしょうか。これらのロジックをより適切にカプセル化して再利用するにはどうすればよいでしょうか。
実際、PHPer にとって、これらのアイデアは、特定のビジネスを扱う場合には少し面倒ですが、これは PHP の最大の利点でもあります。メモリ リソースを考慮する必要もありません。すぐに挨拶できます。
しかし、これは PHP に固有の大きな欠点でもあります。体系的で一貫した設計システムがありません。
PHP が誕生したとき、PHP はビジネス ニーズを満たす単一の言語であり、JAVA のような体系的な設計システムや原則はありませんでした。 JAVA には 3 つの最も基本的な設計原則があります。 1. グローバル変数はサポートされません。 2. ユニバーサルクラスを作成しないでください。 3. コードはクラスでカプセル化されている必要があります。
JAVA の第 1 原則と第 3 原則は文法上の制限であり、第 2 原則は JAVA プログラマが入門レベルのプログラマであるかどうかを判断する基準です。比較的言えば、PHP にはそのような文法的な設計原則の制限はありませんが、いくつかの大企業に問い合わせたところ、システム原則は実際には存在しません
しかし、デザイン思考に原則がないわけにはいきません。
PHP プログラムは実際には非常に強力であり、構文が適切である限り、コード設計は重要ではなく、さまざまなアイデアに対応するプログラム コードをブロックできます。
初期の PHP はカジュアルすぎたため、簡単に始めることができ、コードを効果的に管理したり再利用したりする必要がありませんでした。
PHPの発展により、PHPはPHP3~PHP4時代の動的マークアップ言語に別れを告げましたが、上位互換性の原則により、PHPは依然として文法が緩い言語です
体系的なプログラミング原則はまだ言語の中核に組み込まれていません。
これは、プログラム コードを改善して作成するために成熟した設計アイデアを使用する必要がないという意味ではありません。
JAVA プログラミング原則とコードの蓄積は JAVA の本質であり、時間の経過とともにますます明らかになります。
JAVA プログラミングのアイデアを PHP プログラミング プロセスに導入します。これは、PHP コードを改善するための優れた方法です。
1. コードの階層パッケージ化
2. 必要に応じてファイルを柔軟に呼び出したりロードしたり、リソースを作成したりできます
3. スムーズでアンチエイジングなディレクトリ構造
これらの問題を解決すると、プログラミング プロセスに多くのメリットがもたらされます。
どうやって解決すればいいでしょうか?
MVC 設計アイデアを分解してカプセル化することで、明確で効果的で一貫性のあるプログラミング アイデアを実現できます。
論理構造から、プログラムはモデル、ビュー、コントローラーの 3 つの論理ブロックとみなすことができます。
JAVA のモデル層はシステムにビジネス ロジックを実装します。これは通常、JavaBean または EJB を使用して実装できます。 View レイヤーはユーザーとの対話に使用され、通常は JSP で実装されます。コントローラー層はモデルとビューの間の通信ブリッジであり、通常はルーター サーブレットをアプリケーション側に拡張したものです。
しかし、PHP にはそのような明確な区分がないため、設計上のアイデアをプログラム コードに統合する必要があります。
1.プログラムコードクラスのカプセル化
アプリケーション要件 (例: 類似した類似製品ページ) の場合、最初に要件を 3 つのファイルに分割します。
名前から各ファイルのコードの目的もわかります。残りの作業は、各ファイルのクラスに名前を付けることです。
これらは 1 つのアプリケーションの異なる操作クラスであるため、各クラスに異なるカテゴリ サフィックスを追加する必要があります。
たとえば、similar.controller.php
//コントローラー制御プログラムクラス このクラスを完成させるメソッドは、プログラムの各ページの処理です (ページの呼び出し規則に合わせて) 各メソッドは同期リクエストページに対応します
同様のクラス{
//類似商品ページの表示
関数 do_opensearch($_param){
//リクエストパラメータのフィルタリング
//商品データをリクエストします
//プレゼンテーションルールに従って商品データを処理します
// 商品データをレンダリングして HTML を取得してレンダリングします
// HTML の表示とレンダリング
}
}
対応するリクエストは
http://s.etao.com/similar/opensearch/
似たような.model.php
//モデルデータ操作プログラムクラスは、このアプリケーションに対するデータリクエストのカプセル化を完了し、結果の構造解析処理を返します
類似クラスMODEL{
}
似たような.view.php
//モデルレンダリング操作プログラムクラス このアプリケーションのデータレンダリングのカプセル化を完了し、処理済みのものに返します
類似クラスVIEW{
関数 view_getDetail($_goodDataArr){
return $html;
}
}
2.クラスコール
各ロジックとコードを異なるファイルとクラスに明確にカプセル化しました。柔軟に呼び出すにはどうすればよいでしょうか? PHP はインタプリタ型言語であり、JAVA や C のようなコンパイルプロセスがありません。プリコンパイルプロセスではコンパイル言語の自動接続機能を利用できません。
実際、PHP インタープリターはこの問題を認識しており、5.3.1 以降ではこの問題を解決するための autoload メソッドを提案しています。インタープリターは、宣言されていないクラスまたは関数に遭遇すると、自動的に autoload を実行してそれを再度ロードします。まだエラーを報告していません。
詳細については、http://php.net/manual/ja/ language.oop5.autoload.php
を参照してください。
しかし、これはまだ消極的な解決策です。アクティブな動的読み込みソリューションを以下に示します。リソースシステム動員カテゴリーに参加してください
このクラスの使用法を説明する前に、クラス ファイルをロードして使用する以前のプロセスを見てみましょう:
ファイル:similar.controller.php
require_once PATH."similar.model.php";
$sModelObj = 新しい類似モデル;
$goodsData = $sModelObj->getGoodsInfoByNid($nid);
これがプロセス中に呼び出される場合は、次のように記述する必要があります
require_once PATH."similar.model.php";
同様のクラス{
パブリック $_modelObj;
関数 __construct(){
$this->_modelObj = 新しい類似モデル;
}
//類似商品ページの表示
関数 do_opensearch($_param){
//商品データをリクエストします
$goodsInfoArr = $this->_modelObj->getGoodsInfoByNid($nid);
}
}//授業終了
コントローラー クラスがフォレスト、ha3 などの別の MODEL を使用する必要がある場合は、複数のクラス内要素変数を宣言する必要があります。 PHPの変数送信機能を利用して、必要なクラスを均一に読み込み、スケジュールし、宣言するリソーススケジューリングクラスを作成すると、さらに便利になります。このリソース スケジューリング クラスの設計を詳しく見てみましょう
パブリック静的関数 getObj($_appName,$_typeStr='class') {
if($_typeStr=='クラス'){
$className = $_appName;
}その他{
$className = $_appName.strtoupper($_typeStr);
}
//リソースオブジェクトが作成され、直接使用できるように返されました
if( isset(self::$_modelObjArr[$className]) && is_object(self::$_modelObjArr[$className]) ){
return self::$_modelObjArr[$className;
]
}
// ファイルリソースファイルをロードします
$file = dirname(__FILE__)."{$_appName}/{$_appName}.{$_typeStr}.php";
if( file_exists($file) ){
require_once $file;
if( class_exists($className) ){
return self::_createObj($className);
}その他{
$errStr = "ファイル {$file} にクラス {$className} がありません" // クラス名が間違っています
}
} その他 {
$errStr = "クラスファイル{$file}がありません" //クラスファイルエラー
}
self::_showErr($errStr);
}
//リソースオブジェクトを作成します
パブリック静的関数 _createObj($_className){
if( isset(self::$_modelObjArr[$_className]) && is_object(self::$_modelObjArr[$_className]) ){
return self::$_modelObjArr[$_className];
}その他{
self::$_modelObjArr[$_className] = 新しい $_className();
return self::$_modelObjArr[$_className];
}
}
//エラーメッセージ
パブリック静的関数 _showErr($_errTypeStr=''){
エコー $_errTypeStr; 終了;
//エラーログ($_errTypeStr);
}
}//授業終了
代わりに Box リソース スケジューリング クラスを使用し、クラス プログラムをロードします
ファイル:similar.controller.php
/**
* 指定されたタイプのクラスプログラムをロードします
**/
クラスボックス{
//インプロセスリソースオブジェクトプールを宣言します
パブリック静的$_modelObjArr;
//リソースオブジェクトを取得します
同様のクラス{
関数 __construct(){
}
//類似商品ページの表示
関数 do_opensearch($_param){
//商品データをリクエストします
$goodsInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
$html = Box::getObj('similar','view')->view_getDetail($goodsInfoArr);
//その他のカプセル化されたデータロジック
$hotHtml = $this->_getHotHtml();
}
関数 do_search($_param){
$goodsInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
$html = Box::getObj('similar','view')->view_getDetail($goodsInfoArr);
}
関数_getHotHtml(){
$hotInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
$html = Box::getObj('similar','view')->view_getDetail($goodsInfoArr);
$hotInfoArr;
を返します
}
}//授業終了
このように、「similar.model.php」ファイルは応答プロセスで 1 回だけロードされ、similarMODEL は 1 回だけ作成されます。
いつでもお電話ください。事前に宣言する必要がなく、繰り返し読み込みや繰り返し作成を考慮する必要もありません。
Box は、クラス間のリソースの呼び出しと作成を解決します。
では、コントローラー クラス ファイル内の関数を実行するにはどうすればよいでしょうか?リクエストディスパッチクラス Bin が必要です。
以前は、リクエストへの応答はすべて、Websearch の IO モデルを通じて完了していました。要求されたパスを実際のファイルにマップします。
例:
xxxx.taovao.com/similar/opensearch/index.php や xxx.etao.com/similar/opensearch.php のようなファイルの場合、websearch はホストを実際のファイル システムのパスに置き換えます。
このように、外部プログラムはさまざまな方法でディレクトリをスキャンする可能性があり、注意しないと、隠れたリスクを伴う ex:xxxx.taovao.com/tools/info.php などの一般的な方法が公開されてしまいます。 。
もちろん、いくつかのフィルタリング条件を追加すると、このような問題を回避できますが、Web サーバーのロジックが変更されると、Web サーバーの conf が変更されます。トラブル。 Web サーバーを使用して、現実的な方法で io と http をパッケージ化および解凍してみましょう
アプリサーバーがリクエスト呼び出しをフィルタリングし、柔軟に構成できるようにします。 Web サーバーでは、すべてのアクセスが host/dispatch.php にマッピング (書き換え) され、Bin クラスによってスケジューリングと配布が実装されます。アプリケーション ロジックの単一エントリ呼び出し構造を実装します。
dispatch.php は、プラットフォームの割り当て、パフォーマンスの監視、構成の読み込み、アプリケーションの起動、タイプ入力 (同期、非同期、PC、モバイル)、およびその他のプラットフォーム レベルの機能を実行します。
Bin クラスには次の機能が必要です: リクエストを解析し、分解を完了するために Web サーバーによって渡された環境変数をレスポンスの実際の処理アプリケーションに渡し、類似したアプリケーション名、opensearch メソッド名を提案します。
リクエスト パラメータ配列にアセンブルされる GET および POST リクエスト パラメータもあります
1
2 $this->_paramArr =explode( '/', trim(strtok( urldecode($_SERVER["REQUEST_URI"]),'?'),'/'));
$this->_paramArr = array_merge($this->_paramArr,$_GET);
このように $this->_paramArr[0] が appname アプリケーション名になります
このように、$this->_paramArr[1] は関数のメソッド名 www.2cto.com
になります
プラットフォーム プロセスは、appname.class.php ファイルをロードし、appname->do_function($this->_paramArr); メソッドを実行できます。
これは /similar/opensearch/sort/ のようなパラメーターの受け渡しもサポートしています。sort は $this->_paramArr[2] のパラメーターです
$this->_paramArr[0] が ajax と等しい場合、これは js によって開始された非同期リクエストであることを意味します
ロードする必要があるのは appname.ajax.php で、 appnameAJAX->ajax_function();
を実行します。
同期リクエストと非同期リクエストをファイルに分割します。大きなファイルの読み込みによるメモリ使用量を削減します。
アクセス可能なディレクトリとアプリケーション ディレクトリを物理的に分類して、スキャナを役に立たなくすることも可能です。
例:
/home/website/host/ このディレクトリには、index.php という 1 つのファイルと、cdn に追加されない css、js、画像などのいくつかのレンダリング ファイルのみが含まれます。 Webサーバーのドキュメントルートまたはアクションをこのディレクトリに設定します
/home/website/app/ このディレクトリは、クラス プログラム ファイルと記述された設定を保存するために使用されます。app ディレクトリ内のクラス プログラム ファイルは、/host/index.php プログラムによってロードされます
。
1 つのアプリケーションを扱うのは簡単ですが、多数のアプリケーションを扱う場合はどうすればよいでしょうか?複数のアプリケーションのディレクトリ構造について話しましょう。
3. ディレクトリ構造 (アンチエイジングは非常に重要です)
PHP の設計概念は非常に少なく、パッケージという概念さえありません。パッケージのコンセプトを自分たちでパッケージ化するには、カタログを使用する必要がありました。アクセス構造、開発構造、デプロイ構造からディレクトリ構造の役割を紹介します
3a.アクセス構造
アクセスディレクトリホストとアプリケーションディレクトリアプリはWebサイトとみなすことができ、このサイトの下にあるアプリケーションは次のようになります
こんな感じで作れます
/ウェブサイト/ホスト
/ウェブサイト/アプリ/類似
/ウェブサイト/アプリ/cmp
/ウェブサイト/アプリ/srp
/ウェブサイト/アプリ/…..
管理ツールが Web サイトの下に別のディレクトリを作成できる場合
/website/admin/firebox
/website/admin/seoAny
このようにして、すべてのリクエストは /website/host/index.php に送信され、index.php はリクエスト ルールに従って応答ロジック プログラムをロードします。
/webiste/host、/website/system/ と並行してシステム ディレクトリがあり、ここに box.class.php、bin.class.php、base.class.php などのプラットフォーム ファイルが保存されます。
レスポンスの実行プロセスは
webserver クエリ ->[ /website/host/index.php include /website/system/box,bin,base (アプリケーション アーキテクチャ)] プラットフォーム -> [ /website/app/ (アプリケーション プロセス) | 】ページ
3b.開発体制
開発およびメンテナンスのプロセス中に、curl 通信、xml 解析、ログ、タイマー、テンプレート (appview)、その他の自己開発クラス プログラムなどの同様の PHP ライブラリ ファイルがいくつか存在します。また、次のようなサードパーティ クラス ライブラリも存在します。スマートで大きな2GB。
価格比較、メイン検索、My Taobao など、すべてのプロジェクトが共通です。その後、Web サイトと同等の PHPLIBS ディレクトリを作成できます
。/ウェブサイト/ホスト/
/ウェブサイト/アプリ/
/ウェブサイト/システム/
/PHPlibs/etao/ 独自のクラス ライブラリ
/PHPlibs/other/ サードパーティ ライブラリ
各ウェブサイトに 1 つの SVN
PHPlibs/独立した SVN は専任担当者によって保守されているため、より速く、より速く、より安く、よりプロフェッショナルになります
テンプレート ファイルを website/ から分離し、テンプレート ファイルを作成します
webtemplate/directory svn を生徒と共有し、前のセクションのテンプレート クラスのルールに従って生徒にテンプレート ファイルを作成させます。アプリケーションごとにディレクトリに保存されます。
例:
ウェブテンプレート/srp
ウェブテンプレート/cmp
ウェブテンプレート/オープンサーチ
webtemplate/frame はテンプレート、ページヘッダーとフッターを均一に表示します
ウェブテンプレート/…..
Web サイト/アプリのプログラムは、テンプレート クラス メソッドを通じて上記のテンプレート ファイルを呼び出します。
同時に、開発およびメンテナンスのプロセス中に、パブリック ページのヘッダーとテールの定期的な生成、mysql ライブラリからの定期的な EPID データのフェッチなど、シェルの実行を必要とする PHP スクリプトも発生します。あるいはアルゴリズムプログラムを一時的に作成します。
それならできます
app.sh.php プログラム ファイルを /website/app/ の関連アプリケーションに追加します
など
/website/app/similar/similar.sh.php このファイルのクラスプログラムsimilarSHが渡されます
/website/script/run.php を実行します。 script/run.php は CLI リクエストに応答するシェル側のコントローラーであり、host/index.php は CGI リクエストに応答する Web 側のコントローラーです
また、debug.bat ファイルを script/run.php の外側でラップすることもできます。このファイルはすでに DOS にある場合もあり、debug.sh プログラムをラップして、シェル内で対話的にデバッグすることもできます。
特定の参照コード
vm ファイルから変換された PHP テンプレートのパブリック ページ ヘッダー ファイルやフッター ファイルなど、ファイルを処理するプログラムもいくつかあります。Web サイトと並行して webdata ファイルが存在します。
/ウェブサイト/….
/webdata/pageframe およびその他のディレクトリは、アプリ内で直接呼び出します
3c. 展開構造
オンラインスクリプトを通じて個別にチェックアウトします
/ウェブサイト/
/PHPlibs/
/webtemplate/ svn リソース ライブラリ
次に、rpm をパッケージ化してオンラインにプッシュします。
単独でオンラインに移行する場合、オンライン スクリプト構成は、対応するファイルをチェックアウトし、フロントエンド実稼働マシンにプッシュするためにも使用されます。
4. コード仕様
コード形式の仕様については、これを読む前から皆さんが長い間活発に議論してきました。
コード形式の仕様については、IDE で設定して自動的に使用し、定期的なレビューとリマインダーを通じて読みやすいコードを書く習慣を養うことができます。
コード設計仕様はアーキテクチャに従って指定され、実装に準拠する必要があります。
以下で説明するコード設計は、先ほど述べたリソース呼び出しとリクエスト割り当てに基づいています。
4a、カタログについて
//アプリケーション
/ウェブサイト/アプリ/….
//外部アクセスディレクトリ
/website/host/index.php
/ウェブサイト/ホスト/css
/website/host/js
/ウェブサイト/ホスト/画像
//プラットフォーム システム ファイル
/ウェブサイト/ホスト/画像
//スクリプトのデバッグと保守
/ウェブサイト/スクリプト/
//テンプレートライブラリは/website/app/
下のディレクトリに対応します
/webtemplate/….
//プログラムライブラリ
/PHPlibs/
//データファイルディレクトリ
/ウェブデータ
何も言うことはありません、誰もが理解しています。
4b、ファイルについて
ファイルの命名規則は主に内部呼び出しとリクエスト呼び出しを指定します
ウェブサイト/アプリ/アプリ名/アプリ名.apptype.php
アプリタイプ: クラス、モデル、ビュー、ajax、api、sh、…
電話:
Box::getObj(アプリ名,アプリタイプ)->関数();
appname.class.php ファイルはコントローラー ファイルであり、クラス内のメソッドは同期要求応答を実行します。
appname.ajax.php ファイルもコントローラー ファイルであり、クラス内のメソッドは非同期リクエスト応答を作成します。
appname.sh.php ファイルもコントローラー ファイルであり、クラス内のメソッドは CLI に応答します。
appname.api.php ファイルは、イメージのフル パスの取得などのパブリック ロジックまたは共通ロジックのカプセル化であるコントローラー ファイルとみなすことができます。
4c、クラスとメソッドについて
クラス名:
appname で直接名前が付けられているクラス ファイルを除き、他のクラス ファイルは appname+APPTYPE で名前が付けられており、APPTYPE は大文字にする必要があります。文法上の区別がしやすい。
メソッドの命名:
たとえば、ビュー クラスのメソッドに html_getSimilarList() を追加し、データベースから取得するには db_getData() を追加し、取得するには file_getData() をメソッド宣言に追加します。ファイルから取得し、エンジンまたはリモートエンドから取得するには url_getData() を使用します。
4d、変数とコメントについて
クラス内変数とパラメータ入力変数には、可読性を高めるためにプロセスで使用されるローカル変数と区別するために _ という接頭辞が付けられます。
同様のクラス{
パブリック $_obj;
関数 do_getpage($_param){
}
}
ファイルのアノテーション = クラスのアノテーション
このクラスの機能を説明するためにファイルの先頭に追加します:
/**
* @パッケージ:
* @access: MixrenSystemBox.inc.php
* 概要: システム アプリケーション テンプレートは、リクエスト モジュールのロードを完了します。
* @作成: 2009 年 12 月 25 日金曜日 16:41:02 CST
* @著者: 朱龍
* @Generator: EditPlus2 & Dreamweaver & Zend & eclipse
*/
メソッドのコメント
/**
* 初期化リクエスト
*paramパラメータの説明
**/
プライベート関数 _parseApp(){
$this->_queryStr = urldecode($_SERVER["REQUEST_URI"]);
$this->_paramArr =explode( '/', トリム(strtok($this->_queryStr,'?'),'/'));
//リクエストモジュールの割り当て
$appName = DEFAULT_APP_NAME;
$this->_className = $appName;
$this->_appFile = APP_PATH . "{$appName}/{$appName}.controller.php";
$this->_method = empty($this->_paramArr[0]) DEFAULT_APP_METHOD : $this->_paramArr[0];
$this->_method = "do_{$this->_method}";
}
授業終了のコメント
クラスビン{
}//授業終了
メンテナンスと読み取りを容易にするために、主要なプロセスとアルゴリズムにコメントを追加します。
オンラインになる前に、オンライン スクリプトを通じて php -w を使用してファイルにコメントが付けられるため、プログラムの実行中に長いコメントがロード メモリを占有することはありません。
5. コード監視
専用のコードスキャンスクリプト。
/website/app/ の下にあるディレクトリ、ファイル、メソッド、およびコメントをスキャンします。
レポート、同期応答クラスの数、同期ページの数、各ファイルのモデル コードの数。等
上記の設計思想に基づいて、CAP 原則である一貫性 (一貫性)、可用性 (再利用性)、およびパーティション (有効性) を最大限に実現するために、フォルダー - 「セグメント化されたクラス ファイル -」機能モジュール方式からツリー構造設計プログラム アーキテクチャが確立されます。部門))
PHP コードをより適切に蓄積できるようにします。
セグメントごとに解釈および実行するためにプログラムを HTML にロードするのではなく、テンプレート (純粋な HTML ファイル、レンダリング構成)、プログラム データ構成ファイルがプログラムにロードされます。
検索テクノロジー ブログからの抜粋—淘宝網