• <noframes id="eeom8"><fieldset id="eeom8"></fieldset></noframes>
  • \n

    echo<\/span> $title<\/span> ?><\/h1>\nfooter<\/span>.php,內(nèi)容:\n\n<\/span><\/body>\n<\/html><\/pre>\n<\/div>\n

    然后,在?views\/item<\/strong>?創(chuàng)建以下幾個視圖文件。<\/p>\n

    index.php<\/strong>,瀏覽數(shù)據(jù)庫內(nèi) item 表的所有記錄,內(nèi)容:<\/p>\n

    \n
    \/item\/add\" method=\"post\">\n \n \n<\/form>\n\n \n$number<\/span> = 0?>\n \nforeach<\/span> ($items<\/span> as<\/span> $item<\/span>): ?>\n class<\/span>=\"big\" href=\"\/item\/view\/$item<\/span>['id'] ?>\" title=\"點擊修改\">\n class<\/span>=\"item\">\n echo<\/span> ++$number<\/span> ?>\n echo<\/span> $item<\/span>['item_name'] ?>\n <\/span>\n <\/a>\n ----\n class<\/span>=\"big\" href=\"\/item\/delete\/$item<\/span>['id']?>\">刪除<\/a>\n\nendforeach<\/span> ?><\/pre>\n<\/div>\n

    add.php<\/strong>,添加記錄,內(nèi)容:<\/p>\n

    \n
    class<\/span>=\"big\" href=\"\/item\/index\">成功添加echo<\/span> $count<\/span> ?>條記錄,點擊返回<\/a><\/pre>\n<\/div>\n

    view.php<\/strong>,查看單條記錄,內(nèi)容:<\/p>\n

    \n
    \/item\/update\" method=\"post\">\n    $item<\/span>['item_name'] ?>\">\n    $item<\/span>['id'] ?>\">\n    \n<\/form>\n \nclass<\/span>=\"big\" href=\"\/item\/index\">返回<\/a><\/pre>\n<\/div>\n

    update.php<\/strong>,更改記錄,內(nèi)容:<\/p>\n

    \n
    class<\/span>=\"big\" href=\"\/item\/index\">成功修改echo<\/span> $count<\/span> ?>項,點擊返回<\/a><\/pre>\n<\/div>\n

    delete.php<\/strong>,刪除記錄,內(nèi)容:<\/p>\n

    \n
    \/item\/index\">成功刪除echo<\/span> $count<\/span> ?>項,點擊返回<\/a><\/pre>\n<\/div>\n

    4.5應(yīng)用測試<\/h2>\n

    這樣,在瀏覽器中訪問 myphp<\/span>程序:http:\/\/localhost\/myphp\/item\/index\/<\/span>,就可以看到效果了。<\/p>\n<\/div>\n

    <\/div>\n
    <\/div>\n"}

    亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

    Table of Contents
    1、MVC
    2、為什么自己開發(fā)MVC框架
    3、準備開發(fā)自己的MVC框架
    3.1目錄準備
    3.2代碼規(guī)范
    3.3重定向
    3.4入口文件
    3.5配置文件和主請求
    3.6控制器/Controller基類
    3.7模型Model基類
    3.8視圖View類
    4、應(yīng)用
    4.1數(shù)據(jù)庫部署
    4.2部署模型
    4.3部署控制器
    4.4部署視圖
    4.5應(yīng)用測試
    Home php教程 php手冊 Notes on writing your own PHP MVC framework

    Notes on writing your own PHP MVC framework

    Sep 28, 2016 am 08:38 AM

    ?

    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流程:

    1. Controller截獲用戶發(fā)出的請求;
    2. Controller調(diào)用Model完成狀態(tài)的讀寫操作;
    3. Controller把數(shù)據(jù)傳遞給View;
    4. 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ī)范:

    1. MySQL的表名需小寫,如:item,car
    2. 模塊名(Models)需首字母大寫,,并在名稱后添加“Model”,如:ItemModel,CarModel
    3. 控制器(Controllers)需首字母大寫,,并在名稱中添加“Controller”,如:ItemController,CarController
    4. 視圖(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>

    這樣做的主要原因有:

    1. 程序有一個單一的入口;
    2. 除靜態(tài)程序,其他所有程序都重定向到 index.php 上;
    3. 可以用來生成利于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/,就可以看到效果了。

    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

    Hot AI Tools

    Undress AI Tool

    Undress AI Tool

    Undress images for free

    Undresser.AI Undress

    Undresser.AI Undress

    AI-powered app for creating realistic nude photos

    AI Clothes Remover

    AI Clothes Remover

    Online AI tool for removing clothes from photos.

    Clothoff.io

    Clothoff.io

    AI clothes remover

    Video Face Swap

    Video Face Swap

    Swap faces in any video effortlessly with our completely free AI face swap tool!

    Hot Tools

    Notepad++7.3.1

    Notepad++7.3.1

    Easy-to-use and free code editor

    SublimeText3 Chinese version

    SublimeText3 Chinese version

    Chinese version, very easy to use

    Zend Studio 13.0.1

    Zend Studio 13.0.1

    Powerful PHP integrated development environment

    Dreamweaver CS6

    Dreamweaver CS6

    Visual web development tools

    SublimeText3 Mac version

    SublimeText3 Mac version

    God-level code editing software (SublimeText3)

    Hot Topics

    PHP Tutorial
    1488
    72