php打造屬于自己的MVC框架
更新時(shí)間:2012年03月07日 23:13:34 作者:
本篇先介紹一下php的MVC實(shí)現(xiàn)原理,我們框架的MVC部分也是基于此原理實(shí)現(xiàn)的,但是今天的代碼并不是框架內(nèi)的代碼,僅僅為說(shuō)明原理
一、文件結(jié)構(gòu)
建立3個(gè)文件夾
controller文件夾存放控制器文件
view文件夾存放視圖文件
model文件夾存放數(shù)據(jù)文件
建立1個(gè)index.php 作為唯一入口
二、控制器
我們?cè)赾ontroller文件夾下建立一個(gè)democontroller.php文件,文件內(nèi)容如下
<?php
class DemoController
{
function index()
{
echo('hello world');
}
}
/* End of file democontroller.php */
這個(gè)文件里面我們只是建立了一個(gè)名為DemoController的對(duì)象并包含一個(gè)index的方法,該方法輸出hello world。下面在index.php中執(zhí)行DemoController中index方法。
index.php的代碼如下
<?php
require('controller/democontroller.php');
$controller=new DemoController();
$controller->index();
/* End of file index.php */
運(yùn)行index.php,ok如愿我們看到了我們久違的hello world。這兩個(gè)文件非常簡(jiǎn)單,但也揭示了一點(diǎn)點(diǎn)mvc的本質(zhì),通過(guò)唯一入口運(yùn)行我們要運(yùn)行的控制器。當(dāng)然controller部分應(yīng)該是由uri來(lái)決定的,那么我們來(lái)改寫(xiě)一下index.php使他能通過(guò)uri來(lái)決定運(yùn)行那個(gè)controller。
index.php改寫(xiě)代碼如下:
<?php
$c_str=$_GET['c'];
//獲取要運(yùn)行的controller
$c_name=$c_str.'Controller';
//按照約定url中獲取的controller名字不包含Controller,此處補(bǔ)齊。
$c_path='controller/'.$c_name.'.php';
//按照約定controller文件要建立在controller文件夾下,類(lèi)名要與文件名相同,且文件名要全部小寫(xiě)。
$method=$_GET['a'];
//獲取要運(yùn)行的action
require($c_path);
//加載controller文件
$controller=new $c_name;
//實(shí)例化controller文件
$controller->$method();
//運(yùn)行該實(shí)例下的action
/* End of file index.php */
在瀏覽器中輸入http://localhost/index.php?c=demo&a=index,得到了我們的hello world。當(dāng)然如果我們有其他的controller并且要運(yùn)行它,只要修改url參數(shù)中的c和a的值就可以了。
這里有幾個(gè)問(wèn)題要說(shuō)明一下。
一、php是動(dòng)態(tài)語(yǔ)言,我們直接可以通過(guò)字符串new出我們想要的對(duì)象和運(yùn)行我們想要的方法,即上面的new $c_name,我們可以理解成new 'DemoController',因?yàn)?c_name本身的值就是'DemoController',當(dāng)然直接new 'DemoController'這么寫(xiě)是不行的,其中的'DemoController'字符串必須通過(guò)一個(gè)變量來(lái)中轉(zhuǎn)一下。方法也是一樣的。
二、我們?cè)趗rl中c的值是demo,也就是說(shuō)$c_name 的值應(yīng)該是demoController呀,php不是區(qū)分大小寫(xiě)嗎,這樣也能運(yùn)行嗎?php區(qū)分大小寫(xiě)這句話不完整,在php中只有變量(前面帶$的)和常量(define定義的)是區(qū)分大小寫(xiě)的,而類(lèi)名方,法名甚至一些關(guān)鍵字都是不區(qū)分大小寫(xiě)的。而true,false,null等只能全部大寫(xiě)或全部小寫(xiě)。當(dāng)然我們最好在實(shí)際編碼過(guò)程中區(qū)分大小寫(xiě)。
三、視圖
我們?cè)谇懊娴腸ontroller中只是輸出了一個(gè)“hello world”,并沒(méi)有達(dá)到mvc的效果,下面我將在此基礎(chǔ)上增加視圖功能,相信到這里大家基本已經(jīng)能想到如何添加視圖功能了。對(duì),就是通過(guò)萬(wàn)惡的require或者include來(lái)實(shí)現(xiàn)。
首先我們?cè)趘iew文件夾下建立一個(gè)index.php,隨便寫(xiě)點(diǎn)什么(呵呵,我寫(xiě)的還是hello world)。之后我們改寫(xiě)一下我們之前的DemoController。代碼如下:
<?php
class DemoController
{
function index()
{
require('view/index.php');
}
}
/* End of file democontroller.php */
再在瀏覽器中運(yùn)行一下,看看是不是已經(jīng)輸出了我們想要的內(nèi)容了。
接著我們通過(guò)controller向view傳遞一些數(shù)據(jù)看看,代碼如下:
<?php
class DemoController
{
function index()
{
$data['title']='First Title';
$data['list']=array('A','B','C','D');
require('view/index.php');
}
}
/* End of file democontroller.php */
view文件夾下index.php文件代碼如下:
<html>
<head>
<title>demo</title>
</head>
<body>
<h1><?php echo $data['title'];?></h1>
<?php
foreach ($data['list'] as $item)
{
echo $item.'<br>';
}
?>
</body>
</html>
建立3個(gè)文件夾
controller文件夾存放控制器文件
view文件夾存放視圖文件
model文件夾存放數(shù)據(jù)文件
建立1個(gè)index.php 作為唯一入口
二、控制器
我們?cè)赾ontroller文件夾下建立一個(gè)democontroller.php文件,文件內(nèi)容如下
復(fù)制代碼 代碼如下:
<?php
class DemoController
{
function index()
{
echo('hello world');
}
}
/* End of file democontroller.php */
這個(gè)文件里面我們只是建立了一個(gè)名為DemoController的對(duì)象并包含一個(gè)index的方法,該方法輸出hello world。下面在index.php中執(zhí)行DemoController中index方法。
index.php的代碼如下
復(fù)制代碼 代碼如下:
<?php
require('controller/democontroller.php');
$controller=new DemoController();
$controller->index();
/* End of file index.php */
運(yùn)行index.php,ok如愿我們看到了我們久違的hello world。這兩個(gè)文件非常簡(jiǎn)單,但也揭示了一點(diǎn)點(diǎn)mvc的本質(zhì),通過(guò)唯一入口運(yùn)行我們要運(yùn)行的控制器。當(dāng)然controller部分應(yīng)該是由uri來(lái)決定的,那么我們來(lái)改寫(xiě)一下index.php使他能通過(guò)uri來(lái)決定運(yùn)行那個(gè)controller。
index.php改寫(xiě)代碼如下:
復(fù)制代碼 代碼如下:
<?php
$c_str=$_GET['c'];
//獲取要運(yùn)行的controller
$c_name=$c_str.'Controller';
//按照約定url中獲取的controller名字不包含Controller,此處補(bǔ)齊。
$c_path='controller/'.$c_name.'.php';
//按照約定controller文件要建立在controller文件夾下,類(lèi)名要與文件名相同,且文件名要全部小寫(xiě)。
$method=$_GET['a'];
//獲取要運(yùn)行的action
require($c_path);
//加載controller文件
$controller=new $c_name;
//實(shí)例化controller文件
$controller->$method();
//運(yùn)行該實(shí)例下的action
/* End of file index.php */
在瀏覽器中輸入http://localhost/index.php?c=demo&a=index,得到了我們的hello world。當(dāng)然如果我們有其他的controller并且要運(yùn)行它,只要修改url參數(shù)中的c和a的值就可以了。
這里有幾個(gè)問(wèn)題要說(shuō)明一下。
一、php是動(dòng)態(tài)語(yǔ)言,我們直接可以通過(guò)字符串new出我們想要的對(duì)象和運(yùn)行我們想要的方法,即上面的new $c_name,我們可以理解成new 'DemoController',因?yàn)?c_name本身的值就是'DemoController',當(dāng)然直接new 'DemoController'這么寫(xiě)是不行的,其中的'DemoController'字符串必須通過(guò)一個(gè)變量來(lái)中轉(zhuǎn)一下。方法也是一樣的。
二、我們?cè)趗rl中c的值是demo,也就是說(shuō)$c_name 的值應(yīng)該是demoController呀,php不是區(qū)分大小寫(xiě)嗎,這樣也能運(yùn)行嗎?php區(qū)分大小寫(xiě)這句話不完整,在php中只有變量(前面帶$的)和常量(define定義的)是區(qū)分大小寫(xiě)的,而類(lèi)名方,法名甚至一些關(guān)鍵字都是不區(qū)分大小寫(xiě)的。而true,false,null等只能全部大寫(xiě)或全部小寫(xiě)。當(dāng)然我們最好在實(shí)際編碼過(guò)程中區(qū)分大小寫(xiě)。
三、視圖
我們?cè)谇懊娴腸ontroller中只是輸出了一個(gè)“hello world”,并沒(méi)有達(dá)到mvc的效果,下面我將在此基礎(chǔ)上增加視圖功能,相信到這里大家基本已經(jīng)能想到如何添加視圖功能了。對(duì),就是通過(guò)萬(wàn)惡的require或者include來(lái)實(shí)現(xiàn)。
首先我們?cè)趘iew文件夾下建立一個(gè)index.php,隨便寫(xiě)點(diǎn)什么(呵呵,我寫(xiě)的還是hello world)。之后我們改寫(xiě)一下我們之前的DemoController。代碼如下:
復(fù)制代碼 代碼如下:
<?php
class DemoController
{
function index()
{
require('view/index.php');
}
}
/* End of file democontroller.php */
再在瀏覽器中運(yùn)行一下,看看是不是已經(jīng)輸出了我們想要的內(nèi)容了。
接著我們通過(guò)controller向view傳遞一些數(shù)據(jù)看看,代碼如下:
復(fù)制代碼 代碼如下:
<?php
class DemoController
{
function index()
{
$data['title']='First Title';
$data['list']=array('A','B','C','D');
require('view/index.php');
}
}
/* End of file democontroller.php */
view文件夾下index.php文件代碼如下:
復(fù)制代碼 代碼如下:
<html>
<head>
<title>demo</title>
</head>
<body>
<h1><?php echo $data['title'];?></h1>
<?php
foreach ($data['list'] as $item)
{
echo $item.'<br>';
}
?>
</body>
</html>
您可能感興趣的文章:
- PHP從零開(kāi)始打造自己的MVC框架之類(lèi)的自動(dòng)加載實(shí)現(xiàn)方法詳解
- PHP從零開(kāi)始打造自己的MVC框架之入口文件實(shí)現(xiàn)方法詳解
- PHP的MVC模式實(shí)現(xiàn)原理分析(一相簡(jiǎn)單的MVC框架范例)
- php實(shí)現(xiàn)最簡(jiǎn)單的MVC框架實(shí)例教程
- php實(shí)現(xiàn)簡(jiǎn)單的MVC框架實(shí)例
- 搭建自己的PHP MVC框架詳解
- PHP簡(jiǎn)單的MVC框架實(shí)現(xiàn)方法
- PHP MVC框架路由學(xué)習(xí)筆記
- PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法分析
- PHP URL路由類(lèi)實(shí)例
- php編寫(xiě)一個(gè)簡(jiǎn)單的路由類(lèi)
- PHP從零開(kāi)始打造自己的MVC框架之路由類(lèi)實(shí)現(xiàn)方法分析
相關(guān)文章
PHP7.1方括號(hào)數(shù)組符號(hào)多值復(fù)制及指定鍵值賦值用法分析
這篇文章主要介紹了PHP7.1方括號(hào)數(shù)組符號(hào)多值復(fù)制及指定鍵值賦值用法,結(jié)合實(shí)例形式對(duì)比分析了php7數(shù)組復(fù)制與賦值的新特性與操作技巧,需要的朋友可以參考下2016-09-09PHP 刪除一個(gè)目錄及目錄下的所有文件的函數(shù)代碼
PHP刪除一個(gè)目錄及目錄下的文件代碼,即刪除目錄或刪除文件。2010-05-05編寫(xiě)安全 PHP應(yīng)用程序的七個(gè)習(xí)慣深入分析
本篇文章是對(duì)編寫(xiě)安全-PHP應(yīng)用程序的七個(gè)習(xí)慣進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP函數(shù)實(shí)現(xiàn)分頁(yè)含文本分頁(yè)和數(shù)字分頁(yè)
分頁(yè)功能是經(jīng)常使用的一個(gè)功能,因此用PHP實(shí)現(xiàn)分頁(yè),文本分頁(yè)和數(shù)字分頁(yè),對(duì)其以函數(shù)形式進(jìn)行了封裝2014-10-10PHP編程獲取圖片的主色調(diào)的方法【基于Imagick擴(kuò)展】
這篇文章主要介紹了PHP編程獲取圖片的主色調(diào)的方法,基于PHP的Imagick擴(kuò)展實(shí)現(xiàn)針對(duì)圖片的顏色值獲取功能,需要的朋友可以參考下2017-08-08php使用Cookie控制訪問(wèn)授權(quán)的方法
這篇文章主要介紹了php使用Cookie控制訪問(wèn)授權(quán)的方法,分析了Cookie控制訪問(wèn)授權(quán)的原理與使用技巧,需要的朋友可以參考下2015-01-01