背景:
在日常使用中我們泽艘,以在沒(méi)有框架的時(shí)候我們?nèi)粘J褂煤苈闊?/p>
1.類很多沒(méi)有歸類匯總
2.每次使用代碼總是要重寫辩越,沒(méi)有達(dá)到代碼復(fù)用的目的
3.在協(xié)作的時(shí)候,每個(gè)人由于代碼文件擺放習(xí)慣不一,會(huì)造成很混亂
4.如果代碼除了問(wèn)題,無(wú)法精確到到底那塊有問(wèn)題
于是:
MVC 設(shè)計(jì)思想橫空出世
M - Model 模型 數(shù)據(jù)庫(kù)的交互
V - view 視圖(有html文件或自定義的模板文件)
C - Controller 控制器 與用戶的交互(接收參數(shù)沛硅,控制跳轉(zhuǎn)等。绕辖。)
疑問(wèn)
Q:在這里我們發(fā)現(xiàn)多了一個(gè)我們前面沒(méi)講到了index.php(入口文件)摇肌,為什么要有一個(gè)入口文件的概念呢?
A:我們來(lái)個(gè)例子讓我們更好知道為什么仪际。假設(shè)你開(kāi)了一個(gè)動(dòng)物園或者電影院之類的使用門票進(jìn)行收費(fèi)的項(xiàng)目围小,如果你不設(shè)置任何圍墻,欄桿之類的防護(hù)措施树碱,根本不會(huì)有人理會(huì)“需要買票才能進(jìn)入” 這個(gè)概念肯适,所以我們這個(gè)項(xiàng)目也是同理,先關(guān)閉所有可能進(jìn)入的地方成榜,僅僅留下一個(gè)買票進(jìn)入的入口框舔,這樣就可以方便收費(fèi),別人必須買票才能進(jìn)得去赎婚。
我們這個(gè)項(xiàng)目也是同理刘绣。
我們?cè)诨疽呀?jīng)具備了一個(gè)項(xiàng)目的基本雛形但是僅僅一個(gè)index.php是不夠的,因?yàn)楣庖粋€(gè)文件怎么實(shí)現(xiàn)挣输,我們不可能把整個(gè)項(xiàng)目所有代碼放在入口文件中這樣違背了MVC的基本概念额港。
那怎么實(shí)現(xiàn)呢?
我們這里引入另一個(gè)概念---路由
路由的本質(zhì)就是讓鏈接中帶的參數(shù)與對(duì)應(yīng)控制器中的方法產(chǎn)生關(guān)聯(lián)
在此教程中我僅僅講了某幾個(gè)參數(shù)就是控制器名與方法名歧焦,這樣也會(huì)有一定的安全隱患移斩,我后面也會(huì)繼續(xù)出教程講解關(guān)于參數(shù)與方法不一樣但是也能產(chǎn)生對(duì)應(yīng)關(guān)系的教程我們后續(xù)會(huì)講到
我們由于目錄關(guān)系,我們來(lái)約定三個(gè)參數(shù)
1.p -> platform 平臺(tái)(前绢馍、后臺(tái))
2.c -> Controller 控制器名(或控制器名的一部分比如 IndexController 我們只穿Index即可
3.a -> Action 就是某個(gè)控制中的某個(gè)方法
前面的鋪墊后我們現(xiàn)在正式開(kāi)始向瓷!
補(bǔ)充
關(guān)鍵!舰涌!關(guān)鍵2巍!關(guān)鍵4砂摇朱躺!我們這個(gè)項(xiàng)目有一個(gè)關(guān)鍵就是除index.php和一般的php文件之外,所有類文件都使用命名空間搁痛,空間地址就是路徑地址
我們現(xiàn)在在Core目錄下創(chuàng)建一個(gè)App.php
代碼如下:
<?php
namespace Core;
class App
{
/**
* 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
* 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
* 3.我們項(xiàng)目的命名空間必須等于路徑
*/
public static function run(){}
}
并在根目錄的index.php中引入App.php 并靜態(tài)訪問(wèn)run方法长搀。
require_once './Core/App.php';
\Core\App::run();
繼續(xù)在App.php中增加init靜態(tài)方法,為了設(shè)置請(qǐng)求頭等一般初始化配置別忘了還要在run中調(diào)用
namespace Core;
class App
{
/**
* 初始化項(xiàng)目
* 設(shè)置請(qǐng)求頭
*/
public static function init(){
header('content-type:text/html;charset=utf-8');
}
/**
* 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
* 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
* 3.我們項(xiàng)目的命名空間必須等于路徑
*/
public static function run(){
self::init();
}
}
增加了setDir靜態(tài)方法-讓以后文件加載更加精確
/**
* 定義目錄方便以后文件加載更精確
*/
public static function setDir(){
//這里使用了str_replace鸡典,由于windows目錄會(huì)有\(zhòng) 這種斜杠源请,但是如果去到linux或者unix系統(tǒng)會(huì)轉(zhuǎn)義所以還是先替換了
define('ROOT_PATH',str_replace('\\','/',dirname(__DIR__).'/'));
define('APP_PATH',ROOT_PATH.'App/');
define('CONF_PATH',ROOT_PATH.'Conf/');
define('PUBLIC_PATH',ROOT_PATH.'Public/');
define('VEND_PATH',ROOT_PATH.'Vendor/');
}
在Conf目錄中創(chuàng)建app.php
return [
'mysql'=>[
'type'=>'mysql',
'server'=>'localhost',
'username'=>'root',
'password'=>'root',
'dbname'=>'ecframe',
'charset'=>'utf8'
],
];
并在Core/App.php中增加getConf方法讀取配置文件靜態(tài)方法
/**
* 讀取配置文件方便后面使用
*/
public static function getConf(){
$GLOBALS['conf']=include CONF_PATH.'app.php';
}
總結(jié)代碼:
index.php
<?php
require_once './Core/App.php';
\\Core\\App::run();
Core/App.php
<?php
/**
*
* App.php
* User: kalvin
* Date: 2018/1/29
* Time: 下午4:17
*/
namespace Core;
class App
{
/**
* 初始化項(xiàng)目
* 設(shè)置請(qǐng)求頭
*/
public static function init(){
header('content-type:text/html;charset=utf-8');
}
/**
* 定義目錄方便以后文件加載更精確
*/
public static function setDir(){
//這里使用了str_replace,由于windows目錄會(huì)有\(zhòng) 這種斜杠,但是如果去到linux或者unix系統(tǒng)會(huì)轉(zhuǎn)義所以還是先替換了
define('ROOT_PATH',str_replace('\\','/',dirname(__DIR__).'/'));
define('APP_PATH',ROOT_PATH.'App/');
define('CONF_PATH',ROOT_PATH.'Conf/');
define('PUBLIC_PATH',ROOT_PATH.'Public/');
define('VEND_PATH',ROOT_PATH.'Vendor/');
}
/**
* 讀取配置文件方便后面使用
*/
public static function getConf(){
$GLOBALS['conf']=include CONF_PATH.'app.php';
}
/**
* 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
* 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
* 3.我們項(xiàng)目的命名空間必須等于路徑
*/
public static function run(){
self::init();
self::setDir();
self::getConf();
}
}
Conf/app.php
<?php
/**
*
* app.php
* User: kalvin
* Date: 2018/1/29
* Time: 下午4:35
*/
return [
'mysql'=>[
'type'=>'mysql',
'server'=>'localhost',
'username'=>'root',
'password'=>'root',
'dbname'=>'ecframe',
'charset'=>'utf8'
],
];
如果覺(jué)得我的文章對(duì)你有幫助又或者喜歡,別忘了關(guān)注.喜歡加轉(zhuǎn)發(fā),當(dāng)然如果可以打賞我一下奶茶錢也是可以的哦(#.#)