本篇,咱們來實現加載控制器、數據查詢和頁面渲染。php
原文地址:http://www.voidking.com/2017/...html
在app目錄下,新建ctrl目錄,ctrl目錄下新建indexCtrl.php文件,內容以下:mysql
<?php namespace app\ctrl; class indexCtrl{ public function index(){ echo 'index ctrl'; } }
在根目錄下的index.php文件中,繼續添加:git
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」。github
一、在mysql中,新建數據庫vkphp。sql
二、在vkphp數據庫中,新建表vk_user,字段包括id、username和password。數據庫
三、在common文件夾下,新建db.php,內容以下:數組
<?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(); } } }
四、在indexCtrl.php中,添加:app
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 ,便可看到從數據庫中查詢出的數據。框架
頁面渲染,主要有兩部分工做:賦值和顯示。咱們須要實現兩個函數:assign和display。
一、在app目錄下新建view目錄,view目錄下新建index目錄,index目錄中新建render.html,內容以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Render</title> </head> <body> <p>第一個視圖</p> <p>用戶名:<?php echo $username; ?></p> </body> </html>
二、在core目錄中,添加render.php,內容以下:
<?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); //把數組變成變量 include $file; } } }
三、修改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 ,便可看到渲染出的頁面。
直接在頁面echo,難以體現水平,咱們來安裝一個模板引擎――smarty。
接下來smarty的使用,牽涉到命名空間這個知識點,在此學習一下。
首先聲明:命名空間和文件路徑沒有關係,沒有關係,沒有關係!雖然,在使用命名空間時常常參考文件路徑,可是,它們沒有必然關係。
命名空間的做用:解決重名問題。不一樣的命名空間中,能夠存在相同類名和函數名。咱們在使用一個類和函數時,必須明確指出使用的是哪個命名空間中的類和函數。
上文咱們說到,在文件系統中訪問一個文件有三種方式,PHP命名空間中的元素使用一樣的原理。例如,類名能夠經過三種方式引用:
一、非限定名稱,或不包含前綴的類名稱,例如 $a=new foo();
或 foo::staticmethod();
。若是當前命名空間是 currentnamespace,foo 將被解析爲 \currentnamespace\foo
;若是當前沒有指定命名空間,則foo會被解析爲 \foo
。
二、限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo();
或 subnamespace\foo::staticmethod();
。若是當前的命名空間是 currentnamespace,則 foo 會被解析爲 \currentnamespace\subnamespace\foo
;若是當前沒有指定命名空間,foo 會被解析爲\subnamespace\foo
。
三、徹底限定名稱,或包含了全局前綴操做符的名稱,例如,$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官方下載 ,下載smarty,小編下載的是3.1.30版本。
二、在根目錄下新建lib,解壓smarty到lib目錄下,重命名文件夾爲smarty。
一、在app目錄下新建smarty目錄,smarty目錄下新建templates、template_c、configs、cache四個目錄。
二、在templates目錄下新建index目錄,index目錄中新建render2.html,內容以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Smarty</title> </head> <body> <p>第一個Smarty頁面</p> <p>用戶名:{{$username}}</p> </body> </html>
三、修改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); //把數組變成變量 include $file; } } }
四、修改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/v...