從零開始打造自己的PHP框架――第2章

目標(biāo)

本篇明也,我們來實現(xiàn)加載控制器铭段、數(shù)據(jù)查詢和頁面渲染。

加載控制器

控制器

在app目錄下胧华,新建ctrl目錄寄症,ctrl目錄下新建indexCtrl.php文件宙彪,內(nèi)容如下:

<?php
namespace app\ctrl;

class indexCtrl{
    public function index(){
        echo 'index ctrl';
    }
}

調(diào)用控制器

在根目錄下的index.php文件中,繼續(xù)添加:

include CORE.'/autoload.php';
spl_autoload_register('\core\autoload::load');
$route = new \core\route();

$ctrl = $route->ctrl;
$action = $route->action;
$params = $route->params;
$ctrl_file = APP.'/ctrl/'.$ctrl.'Ctrl.php';
$ctrl_class = '\\app\\ctrl\\'.$ctrl.'Ctrl';
if(is_file($ctrl_file)){
    include $ctrl_file;
    $ctrl_obj = new $ctrl_class;
    $ctrl_obj->$action();
}else {
    throw new \Exception('找不到控制器'.$ctrl_file);
}

訪問地址 http://vkphp.dev 有巧,即可看到“index ctrl”释漆。

數(shù)據(jù)查詢

1、在mysql中篮迎,新建數(shù)據(jù)庫vkphp男图。

2、在vkphp數(shù)據(jù)庫中甜橱,新建表vk_user逊笆,字段包括id、username和password岂傲。

3难裆、在common文件夾下,新建db.php譬胎,內(nèi)容如下:

<?php
namespace core\common;

class db extends \PDO{
    public function __construct(){
        $dsn = 'mysql:host=localhost;dbname=vkphp';
        $username = 'root';
        $passwd = '';
        try{
            parent::__construct($dsn,$username,$passwd);
            // echo 'database connect success';
        }catch (\Exception $e){
            echo $e->getMessage();
        }
    }
}

4差牛、在indexCtrl.php中,添加:

public function data(){
    $db = new \core\common\db();
    $sql = 'select * from vk_user';
    $result = $db->query($sql);
    p($result);
    p($result->fetchAll());
}

訪問地址 http://vkphp.dev/index/data 堰乔,即可看到從數(shù)據(jù)庫中查詢出的數(shù)據(jù)。

頁面渲染

頁面渲染脐恩,主要有兩部分工作:賦值和顯示镐侯。我們需要實現(xiàn)兩個函數(shù):assign和display。

1驶冒、在app目錄下新建view目錄苟翻,view目錄下新建index目錄,index目錄中新建render.html骗污,內(nèi)容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Render</title>
</head>
<body>
    <p>第一個視圖</p>
    <p>用戶名:<?php echo $username; ?></p>
</body>
</html>

2崇猫、在core目錄中,添加render.php需忿,內(nèi)容如下:

<?php
namespace core;

class render{
    public $params = array();
    public function assign($name,$value){
        $this->params[$name] = $value;
    }

    public function display($file){
        $file = APP.'/view/'.$file;
        if(is_file($file)){
            extract($this->params); //把數(shù)組變成變量
            include $file;
        }
    }
}

3诅炉、修改indexCtrl.php如下:

<?php
namespace app\ctrl;

class indexCtrl extends \core\render{
    // 其他

    public function render(){
        $this->assign('username','voidking');
        $this->display('index/render.html');
    }
}

訪問地址 http://vkphp.dev/index/render ,即可看到渲染出的頁面屋厘。

頁面渲染進(jìn)階

直接在頁面echo涕烧,難以體現(xiàn)水平,我們來安裝一個模板引擎――smarty汗洒。

命名空間

接下來smarty的使用议纯,牽涉到命名空間這個知識點,在此學(xué)習(xí)一下溢谤。

首先聲明:命名空間和文件路徑?jīng)]有關(guān)系瞻凤,沒有關(guān)系憨攒,沒有關(guān)系!雖然阀参,在使用命名空間時經(jīng)常參考文件路徑浓恶,但是,它們沒有必然關(guān)系结笨。

命名空間的作用:解決重名問題包晰。不同的命名空間中,可以存在相同類名和函數(shù)名炕吸。我們在使用一個類和函數(shù)時伐憾,必須明確指出使用的是哪一個命名空間中的類和函數(shù)。

上文我們說到赫模,在文件系統(tǒng)中訪問一個文件有三種方式树肃,PHP命名空間中的元素使用同樣的原理。例如瀑罗,類名可以通過三種方式引用:

1胸嘴、非限定名稱,或不包含前綴的類名稱斩祭,例如 $a=new foo();foo::staticmethod(); 劣像。如果當(dāng)前命名空間是 currentnamespace,foo 將被解析為 \currentnamespace\foo 摧玫;如果當(dāng)前沒有指定命名空間耳奕,則foo會被解析為 \foo
2诬像、限定名稱屋群,或包含前綴的名稱,例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod(); 坏挠。如果當(dāng)前的命名空間是 currentnamespace芍躏,則 foo 會被解析為 \currentnamespace\subnamespace\foo ;如果當(dāng)前沒有指定命名空間降狠,foo 會被解析為\subnamespace\foo对竣。
3、完全限定名稱喊熟,或包含了全局前綴操作符的名稱柏肪,例如,$a = new \currentnamespace\foo();\currentnamespace\foo::staticmethod();芥牌。在這種情況下烦味,foo 總是被解析為代碼中的文字名(literal name) \currentnamespace\foo

下面舉個栗子:

<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a 是類 A\B\C\Exception 的一個對象
$b = new \Exception('hi'); // $b 是類 Exception 的一個對象

$c = new ArrayObject; // 致命錯誤, 找不到 A\B\C\ArrayObject 類
?>

下載安裝smarty

1、訪問smarty官方下載 谬俄,下載smarty柏靶,小編下載的是3.1.30版本。

2溃论、在根目錄下新建lib屎蜓,解壓smarty到lib目錄下,重命名文件夾為smarty钥勋。

使用smarty

1炬转、在app目錄下新建smarty目錄,smarty目錄下新建templates算灸、template_c扼劈、configs、cache四個目錄菲驴。

2荐吵、在templates目錄下新建index目錄,index目錄中新建render2.html赊瞬,內(nèi)容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Smarty</title>
</head>
<body>
    <p>第一個Smarty頁面</p>
    <p>用戶名:{{$username}}</p>
</body>
</html>

3先煎、修改core目錄下的render.php如下:

<?php

namespace core;

class render{   
    public $smarty;
    public function __construct(){

        require_once(LIB.'/smarty/libs/Smarty.class.php');
        $this->smarty = new \Smarty();

        $this->smarty->setTemplateDir(APP.'/smarty/templates/');
        $this->smarty->setCompileDir(APP.'/smarty/templates_c/');
        $this->smarty->setConfigDir(APP.'/smarty/configs/');
        $this->smarty->setCacheDir(APP.'/smarty/cache/');
    }

    public $params = array();
    public function assign($name,$value){
        $this->params[$name] = $value;
    }

    public function display($file){
        $file = APP.'/view/'.$file;
        if(is_file($file)){
            extract($this->params); //把數(shù)組變成變量
            include $file;
        }
    }
}

4、修改indexCtrl.php如下:

<?php
namespace app\ctrl;
include CORE.'/render.php';

class indexCtrl extends \render{
    // 其他

    public function render2(){
        $this->smarty->assign('username','voidking');
        $this->smarty->display('index/render2.html');
    }
}

訪問地址 http://vkphp.dev/index/render2 巧涧,即可看到渲染出的頁面薯蝎。

源碼分享

https://github.com/voidking/vkphp/releases/tag/v1.2.0

書簽

從零開始打造自己的PHP框架

使用命名空間:基礎(chǔ)

使用命名空間:后備全局函數(shù)/常量

smarty基礎(chǔ)安裝

smarty進(jìn)階安裝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褒侧,隨后出現(xiàn)的幾起案子良风,更是在濱河造成了極大的恐慌,老刑警劉巖闷供,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異统诺,居然都是意外死亡歪脏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門粮呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婿失,“玉大人,你說我怎么就攤上這事啄寡『拦瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵挺物,是天一觀的道長懒浮。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么砚著? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任次伶,我火速辦了婚禮,結(jié)果婚禮上稽穆,老公的妹妹穿的比我還像新娘冠王。我一直安慰自己,他們只是感情好舌镶,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布柱彻。 她就那樣靜靜地躺著,像睡著了一般餐胀。 火紅的嫁衣襯著肌膚如雪哟楷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天骂澄,我揣著相機(jī)與錄音吓蘑,去河邊找鬼。 笑死坟冲,一個胖子當(dāng)著我的面吹牛磨镶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播健提,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琳猫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了私痹?” 一聲冷哼從身側(cè)響起脐嫂,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紊遵,沒想到半個月后账千,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡暗膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年匀奏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片学搜。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娃善,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瑞佩,到底是詐尸還是另有隱情聚磺,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布炬丸,位于F島的核電站瘫寝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢沿,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一滥搭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捣鲸,春花似錦瑟匆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至外厂,卻和暖如春冕象,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汁蝶。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工渐扮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掖棉。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓墓律,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幔亥。 傳聞我的和親對象是個殘疾皇子耻讽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容