?
1、MVC
MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
PHP中MVC模式也稱Web MVC,從上世紀70年代進化而來。MVC的目的是實現(xiàn)一種動態(tài)的程序設(shè)計,便于后續(xù)對程序的修改和擴展簡化,并且使程序某一部分的重復利用成為可能。除此之外,此模式通過對復雜度的簡化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對自身基本部份分離的同時,也賦予了各個基本部分應(yīng)有的功能。
MVC各部分的職能:
-
模型Model?– 管理大部分的業(yè)務(wù)邏輯和所有的數(shù)據(jù)庫邏輯。模型提供了連接和操作數(shù)據(jù)庫的抽象層。
-
控制器Controller?- 負責響應(yīng)用戶請求、準備數(shù)據(jù),以及決定如何展示數(shù)據(jù)。
-
視圖View?– 負責渲染數(shù)據(jù),通過HTML方式呈現(xiàn)給用戶。
?
一個典型的Web MVC流程:
- Controller截獲用戶發(fā)出的請求;
- Controller調(diào)用Model完成狀態(tài)的讀寫操作;
- Controller把數(shù)據(jù)傳遞給View;
- View渲染最終結(jié)果并呈獻給用戶。
2、為什么自己開發(fā)MVC框架
網(wǎng)絡(luò)上有大量優(yōu)秀的MVC框架可供使用,本教程并不是為了開發(fā)一個全面的、終極的MVC框架解決方案,而是將它看作是一個很好的從內(nèi)部學習PHP的機會,在此過程中,你將學習面向?qū)ο缶幊?/span>和MVC設(shè)計模式,并學習到開發(fā)中的一些注意事項。
更重要的是,你可以完全控制你的框架,并將你的想法融入到你開發(fā)的框架中。雖然不一定是做好的,但是你可以按照你的方式去開發(fā)功能和模塊。
3、準備開發(fā)自己的MVC框架
3.1目錄準備
在開始開發(fā)前,讓我們先來把項目建立好,假設(shè)我們建立的項目為 myphp-frame,MVC的框架可以命名為 MyPHP,那么接下來的第一步就是把目錄結(jié)構(gòu)先設(shè)置好。
?
?
雖然在這個教程中不會使用到上面的所有的目錄,但是為了以后程序的可拓展性,在一開始就把程序目錄設(shè)置好使非常必要的。下面就具體說說每個目錄的作用:
-
application?– 應(yīng)用代碼
-
config?– 程序配置或數(shù)據(jù)庫配置
-
myphp?- 框架核心目錄
-
public?– 靜態(tài)文件
-
runtime?- 臨時數(shù)據(jù)目錄
3.2代碼規(guī)范
在目錄設(shè)置好以后,我們接下來就要來規(guī)定一下代碼的規(guī)范:
- MySQL的表名需小寫,如:item,car
- 模塊名(Models)需首字母大寫,,并在名稱后添加“Model”,如:ItemModel,CarModel
- 控制器(Controllers)需首字母大寫,,并在名稱中添加“Controller”,如:ItemController,CarController
- 視圖(Views)部署結(jié)構(gòu)為“控制器名/行為名”,如:item/view.php,car/buy.php
上述的一些規(guī)則是為了能在程序中更好的進行互相的調(diào)用。接下來就開始真正的PHP MVC編程了
3.3重定向
將所有的數(shù)據(jù)請求都重定向 index.php 文件,在 myphp-frame 目錄下新建一個?.htaccess?文件,文件內(nèi)容為:
<IfModule mod_rewrite.c><span style="color: #000000;">
RewriteEngine On
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 確保請求路徑不是一個文件名或目錄</span>
<span style="color: #000000;">
RewriteCond </span>%{REQUEST_FILENAME} !-<span style="color: #000000;">f
RewriteCond </span>%{REQUEST_FILENAME} !-<span style="color: #000000;">d
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 重定向所有請求到 index.php?url=PATHNAME</span>
<span style="color: #000000;">
RewriteRule </span>^(.*)$ index.php?url=$1 [PT,<span style="color: #000000;">L]
</span></IfModule>
這樣做的主要原因有:
- 程序有一個單一的入口;
- 除靜態(tài)程序,其他所有程序都重定向到 index.php 上;
- 可以用來生成利于SEO的URL,想要更好的配置URL,后期可能會需要URL路由,這里先不做介紹了。
3.4入口文件
做完上面的操作,就應(yīng)該知道我們需要做什么了,沒錯!在 myphp-frame目錄下添加?index.php?文件,文件內(nèi)容為:
<?<span style="color: #000000;">php
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 應(yīng)用目錄為當前目錄</span>
<span style="color: #008080;">define</span>('APP_PATH', __DIR__.'/'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 開啟調(diào)試模式</span>
<span style="color: #008080;">define</span>('APP_DEBUG', <span style="color: #0000ff;">true</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 網(wǎng)站根URL</span>
<span style="color: #008080;">define</span>('APP_URL', 'http://localhost/myphp'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載框架</span>
<span style="color: #0000ff;">require</span> './myphp/MyPHP.php';
注意,上面的PHP代碼中,并沒有添加PHP結(jié)束符號”?>”,這么做的主要原因是,對于只有 PHP 代碼的文件,結(jié)束標志(“?>”)最好不存在,PHP自身并不需要結(jié)束符號,不添加結(jié)束符號可以很大程度上防止末尾被添加額外的注入內(nèi)容,讓程序更加安全。
3.5配置文件和主請求
在 index.php 中,我們對 myphp??文件夾下的 MyPHP.php 發(fā)起了請求,那么?MyPHP.php?這個啟動文件中到底會包含哪些內(nèi)容呢?
<?<span style="color: #000000;">php
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 初始化常量</span>
<span style="color: #008080;">defined</span>('FRAME_PATH') or <span style="color: #008080;">define</span>('FRAME_PATH', __DIR__.'/'<span style="color: #000000;">);
</span><span style="color: #008080;">defined</span>('APP_PATH') or <span style="color: #008080;">define</span>('APP_PATH', <span style="color: #008080;">dirname</span>(<span style="color: #800080;">$_SERVER</span>['SCRIPT_FILENAME']).'/'<span style="color: #000000;">);
</span><span style="color: #008080;">defined</span>('APP_DEBUG') or <span style="color: #008080;">define</span>('APP_DEBUG', <span style="color: #0000ff;">false</span><span style="color: #000000;">);
</span><span style="color: #008080;">defined</span>('CONFIG_PATH') or <span style="color: #008080;">define</span>('CONFIG_PATH', APP_PATH.'config/'<span style="color: #000000;">);
</span><span style="color: #008080;">defined</span>('RUNTIME_PATH') or <span style="color: #008080;">define</span>('RUNTIME_PATH', APP_PATH.'runtime/'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 包含配置文件</span>
<span style="color: #0000ff;">require</span> APP_PATH . 'config/config.php'<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">包含核心框架類</span>
<span style="color: #0000ff;">require</span> FRAME_PATH . 'Core.php'<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 實例化核心類</span>
<span style="color: #800080;">$fast</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Core;
</span><span style="color: #800080;">$fast</span>->run();
以上文件都其實可以直接在 index.php 文件中包含,常量也可以直接在 index.php 中定義,我們這么做的原因是為了在后期管理和拓展中更加的方便,所以把需要在一開始的時候就加載運行的程序統(tǒng)一放到一個單獨的文件中引用。
先來看看config文件下的?config .php?文件,該文件的主要作用是設(shè)置一些程序的配置項及數(shù)據(jù)庫連接等,主要內(nèi)容為:
<?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">* 變量配置 *</span><span style="color: #008000;">*/</span>
<span style="color: #008080;">define</span>('DB_NAME',<span style="color: #000000;"> mydb);
</span><span style="color: #008080;">define</span>('DB_USER', 'root'<span style="color: #000000;">);
</span><span style="color: #008080;">define</span>('DB_PASSWORD', 'root'<span style="color: #000000;">);
</span><span style="color: #008080;">define</span>('DB_HOST', 'localhost');
應(yīng)該說 config.php 涉及到的內(nèi)容并不多,不過是一些基礎(chǔ)數(shù)據(jù)庫的設(shè)置,再來看看 myphp下的共用框架入口文件 Core.php 應(yīng)該怎么寫。
<?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* MyPHP核心框架
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Core
{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 運行程序</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> run()
{
spl_autoload_register(</span><span style="color: #0000ff;">array</span>(<span style="color: #800080;">$this</span>, 'loadClass'<span style="color: #000000;">));
</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">setReporting();
</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">removeMagicQuotes();
</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">unregisterGlobals();
</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">Route();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 路由處理</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> Route()
{
</span><span style="color: #800080;">$controllerName</span> = 'Index'<span style="color: #000000;">;
</span><span style="color: #800080;">$action</span> = 'index'<span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$_GET</span>['url'<span style="color: #000000;">])) {
</span><span style="color: #800080;">$url</span> = <span style="color: #800080;">$_GET</span>['url'<span style="color: #000000;">];
</span><span style="color: #800080;">$urlArray</span> = <span style="color: #008080;">explode</span>('/', <span style="color: #800080;">$url</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 獲取控制器名</span>
<span style="color: #800080;">$controllerName</span> = <span style="color: #008080;">ucfirst</span>(<span style="color: #800080;">$urlArray</span>[0<span style="color: #000000;">]);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 獲取動作名</span>
<span style="color: #008080;">array_shift</span>(<span style="color: #800080;">$urlArray</span><span style="color: #000000;">);
</span><span style="color: #800080;">$action</span> = <span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$urlArray</span>[0]) ? 'index' : <span style="color: #800080;">$urlArray</span>[0<span style="color: #000000;">];
</span><span style="color: #008000;">//</span><span style="color: #008000;">獲取URL參數(shù)</span>
<span style="color: #008080;">array_shift</span>(<span style="color: #800080;">$urlArray</span><span style="color: #000000;">);
</span><span style="color: #800080;">$queryString</span> = <span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$urlArray</span>) ? <span style="color: #0000ff;">array</span>() : <span style="color: #800080;">$urlArray</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 數(shù)據(jù)為空的處理</span>
<span style="color: #800080;">$queryString</span> = <span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$queryString</span>) ? <span style="color: #0000ff;">array</span>() : <span style="color: #800080;">$queryString</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 實例化控制器</span>
<span style="color: #800080;">$controller</span> = <span style="color: #800080;">$controllerName</span> . 'Controller'<span style="color: #000000;">;
</span><span style="color: #800080;">$dispatch</span> = <span style="color: #0000ff;">new</span> <span style="color: #800080;">$controller</span>(<span style="color: #800080;">$controllerName</span>, <span style="color: #800080;">$action</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果控制器存和動作存在,這調(diào)用并傳入URL參數(shù)</span>
<span style="color: #0000ff;">if</span> ((int)<span style="color: #008080;">method_exists</span>(<span style="color: #800080;">$controller</span>, <span style="color: #800080;">$action</span><span style="color: #000000;">)) {
</span><span style="color: #008080;">call_user_func_array</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$dispatch</span>, <span style="color: #800080;">$action</span>), <span style="color: #800080;">$queryString</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">exit</span>(<span style="color: #800080;">$controller</span> . "控制器不存在"<span style="color: #000000;">);
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 檢測開發(fā)環(huán)境</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> setReporting()
{
</span><span style="color: #0000ff;">if</span> (APP_DEBUG === <span style="color: #0000ff;">true</span><span style="color: #000000;">) {
</span><span style="color: #008080;">error_reporting</span>(<span style="color: #ff00ff;">E_ALL</span><span style="color: #000000;">);
</span><span style="color: #008080;">ini_set</span>('display_errors','On'<span style="color: #000000;">);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #008080;">error_reporting</span>(<span style="color: #ff00ff;">E_ALL</span><span style="color: #000000;">);
</span><span style="color: #008080;">ini_set</span>('display_errors','Off'<span style="color: #000000;">);
</span><span style="color: #008080;">ini_set</span>('log_errors', 'On'<span style="color: #000000;">);
</span><span style="color: #008080;">ini_set</span>('error_log', RUNTIME_PATH. 'logs/error.log'<span style="color: #000000;">);
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 刪除敏感字符</span>
<span style="color: #0000ff;">function</span> stripSlashesDeep(<span style="color: #800080;">$value</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$value</span> = <span style="color: #008080;">is_array</span>(<span style="color: #800080;">$value</span>) ? <span style="color: #008080;">array_map</span>('stripSlashesDeep', <span style="color: #800080;">$value</span>) : <span style="color: #008080;">stripslashes</span>(<span style="color: #800080;">$value</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$value</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 檢測敏感字符并刪除</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> removeMagicQuotes()
{
</span><span style="color: #0000ff;">if</span> ( <span style="color: #008080;">get_magic_quotes_gpc</span><span style="color: #000000;">()) {
</span><span style="color: #800080;">$_GET</span> = stripSlashesDeep(<span style="color: #800080;">$_GET</span><span style="color: #000000;"> );
</span><span style="color: #800080;">$_POST</span> = stripSlashesDeep(<span style="color: #800080;">$_POST</span><span style="color: #000000;"> );
</span><span style="color: #800080;">$_COOKIE</span> = stripSlashesDeep(<span style="color: #800080;">$_COOKIE</span><span style="color: #000000;">);
</span><span style="color: #800080;">$_SESSION</span> = stripSlashesDeep(<span style="color: #800080;">$_SESSION</span><span style="color: #000000;">);
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 檢測自定義全局變量(register globals)并移除</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> unregisterGlobals()
{
</span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">ini_get</span>('register_globals'<span style="color: #000000;">)) {
</span><span style="color: #800080;">$array</span> = <span style="color: #0000ff;">array</span>('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES'<span style="color: #000000;">);
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$array</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$value</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$GLOBALS</span>[<span style="color: #800080;">$value</span>] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$var</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$var</span> === <span style="color: #800080;">$GLOBALS</span>[<span style="color: #800080;">$key</span><span style="color: #000000;">]) {
</span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$GLOBALS</span>[<span style="color: #800080;">$key</span><span style="color: #000000;">]);
}
}
}
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 自動加載控制器和模型類</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadClass(<span style="color: #800080;">$class</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$frameworks</span> = FRAME_PATH . <span style="color: #800080;">$class</span> . '.class.php'<span style="color: #000000;">;
</span><span style="color: #800080;">$controllers</span> = APP_PATH . 'application/controllers/' . <span style="color: #800080;">$class</span> . '.class.php'<span style="color: #000000;">;
</span><span style="color: #800080;">$models</span> = APP_PATH . 'application/models/' . <span style="color: #800080;">$class</span> . '.class.php'<span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$frameworks</span><span style="color: #000000;">)) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載框架核心類</span>
<span style="color: #0000ff;">include</span> <span style="color: #800080;">$frameworks</span><span style="color: #000000;">;
} </span><span style="color: #0000ff;">elseif</span> (<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$controllers</span><span style="color: #000000;">)) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載應(yīng)用控制器類</span>
<span style="color: #0000ff;">include</span> <span style="color: #800080;">$controllers</span><span style="color: #000000;">;
} </span><span style="color: #0000ff;">elseif</span> (<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$models</span><span style="color: #000000;">)) {
</span><span style="color: #008000;">//</span><span style="color: #008000;">加載應(yīng)用模型類</span>
<span style="color: #0000ff;">include</span> <span style="color: #800080;">$models</span><span style="color: #000000;">;
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> 錯誤代碼 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
}
}
}</span>
下面重點講解主請求方法 callHook(),首先我們想看看我們的 URL 會這樣:
yoursite.com/controllerName/actionName/queryString
callHook()的作用就是,從全局變量 $_GET['url']變量中獲取 URL,并將其分割成三部分:$controller、$action 和 $queryString。
例如,URL鏈接為:myphp.com/item/view/1/first-item,那么
- $controller 就是:item
- $action 就是:view
- 查詢字符串Query String就是:array(1, first-item)
分割完成后,會實例化一個新的控制器:$controller.'Controller'(其中“.”是連字符),并調(diào)用其方法 $action。
3.6控制器/Controller基類
接下來的操作就是在?myphp?中建立程序所需的基類,包括控制器、模型和視圖的基類。
新建控制器基類為?Controller.class.php,控制器的主要功能就是總調(diào)度,具體具體內(nèi)容如下:
<?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* 控制器基類
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Controller
{
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_controller</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_action</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_view</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 構(gòu)造函數(shù),初始化屬性,并實例化對應(yīng)模型</span>
<span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$controller</span>, <span style="color: #800080;">$action</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$this</span>->_controller = <span style="color: #800080;">$controller</span><span style="color: #000000;">;
</span><span style="color: #800080;">$this</span>->_action = <span style="color: #800080;">$action</span><span style="color: #000000;">;
</span><span style="color: #800080;">$this</span>->_view = <span style="color: #0000ff;">new</span> View(<span style="color: #800080;">$controller</span>, <span style="color: #800080;">$action</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 分配變量</span>
<span style="color: #0000ff;">function</span> assign(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$this</span>->_view->assign(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 渲染視圖</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> __destruct()
{
</span><span style="color: #800080;">$this</span>->_view-><span style="color: #000000;">render();
}
}</span>
Controller 類實現(xiàn)所有控制器、模型和視圖(View類)的通信。在執(zhí)行析構(gòu)函數(shù)時,我們可以調(diào)用 render() 來顯示視圖(view)文件。
3.7模型Model基類
新建模型基類為?Model.class.php,模型基類 Model.class.php 代碼如下:
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span> Model <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Sql
{
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_model</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_table</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct()
{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 連接數(shù)據(jù)庫</span>
<span style="color: #800080;">$this</span>->connect(DB_HOST, DB_USER, DB_PASSWORD,<span style="color: #000000;"> DB_NAME);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 獲取模型名稱</span>
<span style="color: #800080;">$this</span>->_model = <span style="color: #008080;">get_class</span>(<span style="color: #800080;">$this</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->_model = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$this</span>->_model, 'Model'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 數(shù)據(jù)庫表名與類名一致</span>
<span style="color: #800080;">$this</span>->_table = <span style="color: #008080;">strtolower</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">_model);
}
</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> __destruct()
{
}
}</span>
考慮到模型需要對數(shù)據(jù)庫進行處理,所以單獨建立一個數(shù)據(jù)庫基類?Sql.class.php,模型基類繼承 Sql.class.php,代碼如下:
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Sql
{
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_dbHandle</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_result</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 連接數(shù)據(jù)庫</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> connect(<span style="color: #800080;">$host</span>, <span style="color: #800080;">$user</span>, <span style="color: #800080;">$pass</span>, <span style="color: #800080;">$dbname</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
</span><span style="color: #800080;">$dsn</span> = <span style="color: #008080;">sprintf</span>("mysql:host=%s;dbname=%s;charset=utf8", <span style="color: #800080;">$host</span>, <span style="color: #800080;">$dbname</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->_dbHandle = <span style="color: #0000ff;">new</span> PDO(<span style="color: #800080;">$dsn</span>, <span style="color: #800080;">$user</span>, <span style="color: #800080;">$pass</span>, <span style="color: #0000ff;">array</span>(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::<span style="color: #000000;">FETCH_ASSOC));
} </span><span style="color: #0000ff;">catch</span> (PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">exit</span>('錯誤: ' . <span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 查詢所有</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> selectAll()
{
</span><span style="color: #800080;">$sql</span> = <span style="color: #008080;">sprintf</span>("select * from `%s`", <span style="color: #800080;">$this</span>-><span style="color: #000000;">_table);
</span><span style="color: #800080;">$sth</span> = <span style="color: #800080;">$this</span>->_dbHandle->prepare(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span>-><span style="color: #000000;">execute();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$sth</span>-><span style="color: #000000;">fetchAll();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 根據(jù)條件 (id) 查詢</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> select(<span style="color: #800080;">$id</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$sql</span> = <span style="color: #008080;">sprintf</span>("select * from `%s` where `id` = '%s'", <span style="color: #800080;">$this</span>->_table, <span style="color: #800080;">$id</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span> = <span style="color: #800080;">$this</span>->_dbHandle->prepare(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span>-><span style="color: #000000;">execute();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$sth</span>-><span style="color: #000000;">fetch();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 根據(jù)條件 (id) 刪除</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> delete(<span style="color: #800080;">$id</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$sql</span> = <span style="color: #008080;">sprintf</span>("delete from `%s` where `id` = '%s'", <span style="color: #800080;">$this</span>->_table, <span style="color: #800080;">$id</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span> = <span style="color: #800080;">$this</span>->_dbHandle->prepare(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span>-><span style="color: #000000;">execute();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$sth</span>-><span style="color: #000000;">rowCount();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 自定義SQL查詢,返回影響的行數(shù)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> query(<span style="color: #800080;">$sql</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$sth</span> = <span style="color: #800080;">$this</span>->_dbHandle->prepare(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
</span><span style="color: #800080;">$sth</span>-><span style="color: #000000;">execute();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$sth</span>-><span style="color: #000000;">rowCount();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 新增數(shù)據(jù)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> add(<span style="color: #800080;">$data</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$sql</span> = <span style="color: #008080;">sprintf</span>("insert into `%s` %s", <span style="color: #800080;">$this</span>->_table, <span style="color: #800080;">$this</span>->formatInsert(<span style="color: #800080;">$data</span><span style="color: #000000;">));
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->query(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 修改數(shù)據(jù)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> update(<span style="color: #800080;">$id</span>, <span style="color: #800080;">$data</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$sql</span> = <span style="color: #008080;">sprintf</span>("update `%s` set %s where `id` = '%s'", <span style="color: #800080;">$this</span>->_table, <span style="color: #800080;">$this</span>->formatUpdate(<span style="color: #800080;">$data</span>), <span style="color: #800080;">$id</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->query(<span style="color: #800080;">$sql</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 將數(shù)組轉(zhuǎn)換成插入格式的sql語句</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> formatInsert(<span style="color: #800080;">$data</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$fields</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
</span><span style="color: #800080;">$values</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {
</span><span style="color: #800080;">$fields</span>[] = <span style="color: #008080;">sprintf</span>("`%s`", <span style="color: #800080;">$key</span><span style="color: #000000;">);
</span><span style="color: #800080;">$values</span>[] = <span style="color: #008080;">sprintf</span>("'%s'", <span style="color: #800080;">$value</span><span style="color: #000000;">);
}
</span><span style="color: #800080;">$field</span> = <span style="color: #008080;">implode</span>(',', <span style="color: #800080;">$fields</span><span style="color: #000000;">);
</span><span style="color: #800080;">$value</span> = <span style="color: #008080;">implode</span>(',', <span style="color: #800080;">$values</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span> <span style="color: #008080;">sprintf</span>("(%s) values (%s)", <span style="color: #800080;">$field</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 將數(shù)組轉(zhuǎn)換成更新格式的sql語句</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> formatUpdate(<span style="color: #800080;">$data</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$fields</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {
</span><span style="color: #800080;">$fields</span>[] = <span style="color: #008080;">sprintf</span>("`%s` = '%s'", <span style="color: #800080;">$key</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">return</span> <span style="color: #008080;">implode</span>(',', <span style="color: #800080;">$fields</span><span style="color: #000000;">);
}
}</span>
應(yīng)該說,Sql.class.php 是框架的核心部分。為什么?因為通過它,我們創(chuàng)建了一個 SQL 抽象層,可以大大減少了數(shù)據(jù)庫的編程工作。雖然 PDO 接口本來已經(jīng)很簡潔,但是抽象之后框架的可靈活性更高。
3.8視圖View類
視圖類?View.class.php?內(nèi)容如下:
<?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* 視圖基類
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> View
{
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$variables</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_controller</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_action</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$controller</span>, <span style="color: #800080;">$action</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$this</span>->_controller = <span style="color: #800080;">$controller</span><span style="color: #000000;">;
</span><span style="color: #800080;">$this</span>->_action = <span style="color: #800080;">$action</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">/*</span><span style="color: #008000;">* 分配變量 *</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">function</span> assign(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$this</span>->variables[<span style="color: #800080;">$name</span>] = <span style="color: #800080;">$value</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">/*</span><span style="color: #008000;">* 渲染顯示 *</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">function</span><span style="color: #000000;"> render()
{
</span><span style="color: #008080;">extract</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">variables);
</span><span style="color: #800080;">$defaultHeader</span> = APP_PATH . 'application/views/header.php'<span style="color: #000000;">;
</span><span style="color: #800080;">$defaultFooter</span> = APP_PATH . 'application/views/footer.php'<span style="color: #000000;">;
</span><span style="color: #800080;">$controllerHeader</span> = APP_PATH . 'application/views/' . <span style="color: #800080;">$this</span>->_controller . '/header.php'<span style="color: #000000;">;
</span><span style="color: #800080;">$controllerFooter</span> = APP_PATH . 'application/views/' . <span style="color: #800080;">$this</span>->_controller . '/footer.php'<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 頁頭文件</span>
<span style="color: #0000ff;">if</span> (<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$controllerHeader</span><span style="color: #000000;">)) {
</span><span style="color: #0000ff;">include</span> (<span style="color: #800080;">$controllerHeader</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">include</span> (<span style="color: #800080;">$defaultHeader</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 頁內(nèi)容文件</span>
<span style="color: #0000ff;">include</span> (APP_PATH . 'application/views/' . <span style="color: #800080;">$this</span>->_controller . '/' . <span style="color: #800080;">$this</span>->_action . '.php'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 頁腳文件</span>
<span style="color: #0000ff;">if</span> (<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$controllerFooter</span><span style="color: #000000;">)) {
</span><span style="color: #0000ff;">include</span> (<span style="color: #800080;">$controllerFooter</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">include</span> (<span style="color: #800080;">$defaultFooter</span><span style="color: #000000;">);
}
}
}</span>
這樣我們的核心的PHP MVC框架就編寫完成了,下面我們開始編寫應(yīng)用來測試框架功能。
4、應(yīng)用
4.1數(shù)據(jù)庫部署
在 SQL 中新建一個 mydb 數(shù)據(jù)庫,使用下面的語句增加 item 數(shù)據(jù)表并插入2條記錄:
CREATE DATABASE ` mydb ` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE ` mydb `;
CREATE TABLE `item` (
??? `id` int(11) NOT NULL auto_increment,
??? `item_name` varchar(255) NOT NULL,
??? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `item` VALUES(1, 'Hello World.');
INSERT INTO `item` VALUES(2, 'Lets go!');
4.2部署模型
然后,我們還需要在?models?目錄中創(chuàng)建一個?ItemModel.php?模型,內(nèi)容如下:
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span> ItemModel <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Model
{
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> 業(yè)務(wù)邏輯層實現(xiàn) </span><span style="color: #008000;">*/</span><span style="color: #000000;">
}</span>
模型內(nèi)容為空。因為 Item 模型繼承了 Model,所以它擁有 Model 的所有功能。
4.3部署控制器
在 controllers 目錄下創(chuàng)建一個 ItemController.php 控制器,內(nèi)容如下:
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span> ItemController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 首頁方法,測試框架自定義DB查詢</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> index()
{
</span><span style="color: #800080;">$items</span> = (<span style="color: #0000ff;">new</span> ItemModel)-><span style="color: #000000;">selectAll();
</span><span style="color: #800080;">$this</span>->assign('title', '全部條目'<span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('items', <span style="color: #800080;">$items</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加記錄,測試框架DB記錄創(chuàng)建(Create)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> add()
{
</span><span style="color: #800080;">$data</span>['item_name'] = <span style="color: #800080;">$_POST</span>['value'<span style="color: #000000;">];
</span><span style="color: #800080;">$count</span> = (<span style="color: #0000ff;">new</span> ItemModel)->add(<span style="color: #800080;">$data</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('title', '添加成功'<span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('count', <span style="color: #800080;">$count</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 查看記錄,測試框架DB記錄讀?。≧ead)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> view(<span style="color: #800080;">$id</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$item</span> = (<span style="color: #0000ff;">new</span> ItemModel)->select(<span style="color: #800080;">$id</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('title', '正在查看' . <span style="color: #800080;">$item</span>['item_name'<span style="color: #000000;">]);
</span><span style="color: #800080;">$this</span>->assign('item', <span style="color: #800080;">$item</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 更新記錄,測試框架DB記錄更新(Update)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> update()
{
</span><span style="color: #800080;">$data</span> = <span style="color: #0000ff;">array</span>('id' => <span style="color: #800080;">$_POST</span>['id'], 'item_name' => <span style="color: #800080;">$_POST</span>['value'<span style="color: #000000;">]);
</span><span style="color: #800080;">$count</span> = (<span style="color: #0000ff;">new</span> ItemModel)->update(<span style="color: #800080;">$data</span>['id'], <span style="color: #800080;">$data</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('title', '修改成功'<span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('count', <span style="color: #800080;">$count</span><span style="color: #000000;">);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 刪除記錄,測試框架DB記錄刪除(Delete)</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> delete(<span style="color: #800080;">$id</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #800080;">$count</span> = (<span style="color: #0000ff;">new</span> ItemModel)->delete(<span style="color: #800080;">$id</span><span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('title', '刪除成功'<span style="color: #000000;">);
</span><span style="color: #800080;">$this</span>->assign('count', <span style="color: #800080;">$count</span><span style="color: #000000;">);
}
}</span>
4.4部署視圖
在?views?目錄下新建 header.php 和 footer.php 兩個頁頭頁腳模板,內(nèi)容如下。
header.php,內(nèi)容:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$title</span> ?></title>
<style>
.<span style="color: #000000;">item {
width</span>:<span style="color: #000000;">400px;
}
input {
color</span>:<span style="color: #008000;">#</span><span style="color: #008000;">222222;</span>
font-family:georgia,<span style="color: #000000;">times;
font</span>-size:<span style="color: #000000;">24px;
font</span>-weight:<span style="color: #000000;">normal;
line</span>-height:1.<span style="color: #000000;">2em;
color</span>:<span style="color: #000000;">black;
}
a {
color</span>:<span style="color: #000000;">blue;
font</span>-family:georgia,<span style="color: #000000;">times;
font</span>-size:<span style="color: #000000;">20px;
font</span>-weight:<span style="color: #000000;">normal;
line</span>-height:1.<span style="color: #000000;">2em;
text</span>-decoration:<span style="color: #000000;">none;
}
a</span>:<span style="color: #000000;">hover {
text</span>-decoration:<span style="color: #000000;">underline;
}
h1 {
color</span>:<span style="color: #008000;">#</span><span style="color: #008000;">000000;</span>
font-size:<span style="color: #000000;">41px;
letter</span>-spacing:-<span style="color: #000000;">2px;
line</span>-height:<span style="color: #000000;">1em;
font</span>-family:helvetica,arial,sans-<span style="color: #000000;">serif;
border</span>-bottom:1px dotted <span style="color: #008000;">#</span><span style="color: #008000;">cccccc;</span>
<span style="color: #000000;"> }
h2 {
color</span>:<span style="color: #008000;">#</span><span style="color: #008000;">000000;</span>
font-size:<span style="color: #000000;">34px;
letter</span>-spacing:-<span style="color: #000000;">2px;
line</span>-height:<span style="color: #000000;">1em;
font</span>-family:helvetica,arial,sans-<span style="color: #000000;">serif;
}
</span></style>
</head>
<body>
<h1><?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$title</span> ?></h1><span style="color: #000000;">
footer</span>.<span style="color: #000000;">php,內(nèi)容:
</span></body>
</html>
然后,在?views/item?創(chuàng)建以下幾個視圖文件。
index.php,瀏覽數(shù)據(jù)庫內(nèi) item 表的所有記錄,內(nèi)容:
<form action="<?php echo APP_URL ?>/item/add" method="post">
<input type="text" value="點擊添加" onclick="this.value=''" name="value">
<input type="submit" value="添加">
</form>
<br/><br/>
<?php <span style="color: #800080;">$number</span> = 0?>
<?php <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$items</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$item</span>): ?>
<a <span style="color: #0000ff;">class</span>="big" href="<?php echo APP_URL ?>/item/view/<?php echo <span style="color: #800080;">$item</span>['id'] ?>" title="點擊修改">
<span <span style="color: #0000ff;">class</span>="item">
<?php <span style="color: #0000ff;">echo</span> ++<span style="color: #800080;">$number</span> ?>
<?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$item</span>['item_name'] ?>
</span>
</a>
----
<a <span style="color: #0000ff;">class</span>="big" href="<?php echo APP_URL ?>/item/delete/<?php echo <span style="color: #800080;">$item</span>['id']?>">刪除</a>
<br/>
<?php <span style="color: #0000ff;">endforeach</span> ?>
add.php,添加記錄,內(nèi)容:
<a <span style="color: #0000ff;">class</span>="big" href="<?php echo APP_URL ?>/item/index">成功添加<?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$count</span> ?>條記錄,點擊返回</a>
view.php,查看單條記錄,內(nèi)容:
<form action="<?php echo APP_URL ?>/item/update" method="post">
<input type="text" name="value" value="<?php echo <span style="color: #800080;">$item</span>['item_name'] ?>">
<input type="hidden" name="id" value="<?php echo <span style="color: #800080;">$item</span>['id'] ?>">
<input type="submit" value="修改">
</form>
<a <span style="color: #0000ff;">class</span>="big" href="<?php echo APP_URL ?>/item/index">返回</a>
update.php,更改記錄,內(nèi)容:
<a <span style="color: #0000ff;">class</span>="big" href="<?php echo APP_URL ?>/item/index">成功修改<?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$count</span> ?>項,點擊返回</a>
delete.php,刪除記錄,內(nèi)容:
<a href="<?php echo APP_URL ?>/item/index">成功刪除<?php <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$count</span> ?>項,點擊返回</a>
4.5應(yīng)用測試
這樣,在瀏覽器中訪問 myphp程序:http://localhost/myphp/item/index/,就可以看到效果了。