- 更新日: 2017年03月23日
- 公開日: 2015年12月08日
ゼロから始めるPHP講座Vol.43 MVCモデル②~MVCの利点
ゼロから始めるPHP講座MVCモデル②~MVCの利点
MVCモデルの利点
MVCモデルの利点は「それぞれの処理が独立している」ことです。
これにより、何か変更が必要になった際に変更箇所を最小限に抑えられたり、作業分担が容易に行えたりします。
例として、商品一覧ページに以下の変更を行います。
- 消費税の端数は切り上げでなく切り捨てに変更
- テーブルの枠線をより太いものに変更
この場合、変更が必要なファイルと内容は次のようになります。
- model.phpのprice_before_tax関数を変更
- view.phpのtable要素へのborder指定を変更
1はModel、2はViewと、それぞれ別のファイルを変更します。
実際に、model.phpとview.phpを変更してみましょう。
※消費税で端数が出る価格の商品をphpMyAdminから一時的に追加し、変更前と変更後で税込み価格が変わることを確認しましょう。
1.消費税の端数は切り上げでなく切り捨てに変更
/**
* 税込み価格へ変換する(端数は切り捨て)
* @param str $price 税抜き価格
* @return str 税込み価格
*/
function price_before_tax($price) {
return floor($price * TAX);
}
1の変更によりprice_before_tax関数の処理内容が変更となりましたが、これを利用しているControllerに変更の必要はありません。またViewで表示している価格が商品によっては変わりますが、View変更の必要はありません。
<style type="text/css">
table, td, th {
border: solid black 3px;
}
table {
width: 200px;
}
caption {
text-align: left;
}
</style>
2の変更によりCSSの一部を変更しましたが、このファイルの読み込みを行っているControllerに変更の必要はありません。
このようにMVCモデルで設計を行うと「Model」「View」「Controller」それぞれの処理が独立しているため、互いに仕様変更の影響を受けにくくなります。
また作業分担は、予め仕様だけ決めておくことで行えます。
ModelとControllerの間では関数の名前・処理内容・引数・返り値を、ControllerとViewの間では動的に表示する変数の名前と値を決めておきます。
例えば商品一覧を取得する場合、Controller担当者はget_goods_table_list関数の内部でどのような処理を実行しているか知らなくてもプログラムを書くことができます。
特にViewはHTML/CSSを利用した内容が主となるため、エンジニアではなくデザイナーが作成と、担当者が異なる場合が多々あります。
これまで「PHPでHTMLの出力禁止」と何回か指摘されたことがある人もいるかもしれませんが、これはMVCモデルを基礎に処理の独立を考えているためです。
PHP終了タグ
気づいた方もいるかもしれませんが、const.php、model.php、controller.phpでは、ソースコードの最後に終了タグ「?>」がありません。
PHPは「<?php」から開始し「?>」で終了していますが、PHPコードのみからなるファイルでは終了タグを省略することが可能です。
より正確に言えば、終了タグは省略しなければなりません。
終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があります。
これについてはPHPマニュアルにも記載があります。
PHPマニュアルでは「推奨」となっていますが、「必須」と覚えてください。
PHPコードのみからなるファイルで終了タグを省略するデメリットはありません。
PHP終了タグ「?>」
PHPコードのみからなるファイルで終了タグを省略
HTMLの中でPHPを利用する場合は終了タグが必要
これまではHTMLとPHPを同一ファイルに記載していましたが、今後はMVCモデルに従い別ファイルで管理しますので、終了タグの省略を利用してください。
ディレクトリ構成
これまで基本的に全てのファイルを同じディレクトリ(フォルダ)で管理していました。
しかしMVCモデルに沿ってファイルを分割した際、全て同じディレクトリにファイルを置くと管理が大変です。
よってController以外に関してはそれぞれ指定したディレクトリへファイルを移動してください。ディレクトリが存在しない場合、新規作成してください。
ファイル移動後、controller.phpでファイル読み込みをしている記述を変更しましょう。
ファイル一覧
- /htdocs/controller.php
- /include/conf/const.php
- /include/model/model.php
- /include/view/view.php
controller.php変更
// 設定ファイル読み込み
require_once '../include/conf/const.php';
// 関数ファイル読み込み
require_once '../include/model/model.php';
// 商品一覧テンプレートファイル読み込み
include_once '../include/view/view.php';
ユーザからの入力を受け取るControllerファイルはドキュメントルートに置きます。それ以外のファイルはURLから直接アクセスできる必要はありませんので、ドキュメントルート外にファイルを置きましょう。
以前にも説明した通り「一般公開するファイルは必要最低限にする」が基本的な考え方です。
またこのようにディレクトリをModel・View・Controllerで別々にすることで、ファイルが増えていった際の管理がしやすくなります。
よって今後は基本的にこの構成に従って作成しましょう。
NEXT LESSON ☛ MVCモデル③~MVCの使用例
PREV LESSON ☛ MVCモデル①~MVCモデルとは?
- この記事を書いた人
- CodeCampus編集部