知识库php搭建,搭建自己的PHP框架
現在web應用普遍使用的是MVC設計模式,即模型(Model)、視圖(View)和控制器(Controller)搭建框架首先要明白三者的聯系,我們可以設計一個單入口文件模式,具體流程是index.php->獲取參數得到Controller控制器名,method方法名,param參數->構造控制器->構造相應的視圖、模型->調用相應的方法具體步驟1、首先建立一個項目YHPHP
現在web應用普遍使用的是MVC設計模式,即模型(Model)、視圖(View)和控制器(Controller)
搭建框架首先要明白三者的聯系,我們可以設計一個單入口文件模式,具體流程是
index.php->獲取參數得到Controller控制器名,method方法名,param參數->構造控制器->構造相應的視圖、模型->調用相應的方法
具體步驟
1、首先建立一個項目YHPHP,在項目下建立如下目錄app、config、library、tmp
app下建立如下目錄Controllers,Models,Templates,其中分別放入的是控制器,模型,視圖
在Controllers目錄下建立Controller.class.php、IndexController.class.php ,控制器文件格式名為XXXXController.class.php,Controller是所有控制類的基類
在Templates目錄下創建Template.class.php文件,具體作用稍后再說
在Models目錄下創建一個處理數據庫的類Database,這個類添加對數據庫的鏈接訪問,已經常用的增刪改查,然后還在該目錄下創建Model.class.php類 來繼承Database
在libray目錄下創建shared.php文件,common.php文件,common主要放置自定義的全局函數
config下建立config.php文件,其中主要是數據庫和項目的配置
2、在YHPHP根目錄下創建index.php入口文件,具體內容如下
define('DS',DIRECTORY_SEPARATOR);
define('ROOT',dirname(__FILE__));
require_once(ROOT.DS.'config'.DS.'config.php');
require_once(ROOT.DS.'library'.DS.'shared.php');
?>
3、打開第一步創建的shared.php文件,錄入以下代碼
require_once(ROOT.DS."library".DS."common.php");
//類魔術函數
function __autoload($classname){
$classpath = ROOT.DS."app".DS."Controllers".DS.$classname.".class.php";
$classpath_Temp = ROOT.DS."app".DS."Templates".DS.$classname.".class.php";
$classpath_Model = ROOT.DS."app".DS."Models".DS.$classname.".class.php";
if(file_exists($classpath)){
require_once($classpath);
}else if(file_exists($classpath_Temp)){
require_once($classpath_Temp);
}else if(file_exists($classpath_Model)){
require_once($classpath_Model);
}else{
echo 'class file'.$classpath.'not found!';
die;
}
}
function main() {
$Control = isset($_GET["c"])?$_GET["c"]:"Index";
$Method = isset($_GET["m"])?$_GET["m"]:"index";
$Cname = $Control;
$Control = $Control.'Controller';
$dispatch = new $Control($Cname,$Method);
if(method_exists($Control,$Method)){
call_user_func(array($dispatch,$Method));
}else{
echo "沒找到".$Method."方法";
}
}
main();
main函數作用是得到url中的控制器名、方法名、已經參數,url形如localhost/index.php?c=Index&m=hello&name=wei
然后使用$dispatch = new $Control($Cname,$Method); 出一個對象實例,這一步看起來非常奇怪,我們沒有include類的路徑,怎么就可以創建對象呢?
大家仔細看前面還有個__autoload方法,這個方法會在你實例化對象之前自動加載指定的文件,也就是說在實力對象前,會調用__autoload方法,參數就是類的名稱,在__autoload中把類包含進來就可以了
然后使用method_exists函數查看類中是否存在該方法,如果存在調用這個方法。
4、然后打開控制器的基類Controller.class.php,錄入以下代碼
class Controller{
protected $cname;
protected $method;
protected $temp;
public function __construct($cname,$method){
$this->cname = $cname;
$this->method = $method;
$this->temp = new Template($cname,$method);
}
//設置view變量
function setVar($name,$value){
$this->temp->setVar($name,$value);
}
function __destruct() {
$this->temp->render();
}
}
該類在構造的時候有創建了一個Template、Model的實例,然后在析構中調用Template類的render方法,加載對應的模板
5、打開Template.class.php文件錄入以下代碼
class Template {
//變量
protected $variables = array();
protected $cname;
protected $method;
function __construct($cname,$method) {
$this->cname = $cname;
$this->method =$method;
}
function setVar($name,$value){
$this->variables[$name] = $value;
}
function render(){
//數組導入變量
extract($this->variables);
$classpath_Temp = ROOT.DS."app".DS."Templates".DS.$this->cname.DS.$this->method.".php";
if(file_exists($classpath_Temp)){
require_once($classpath_Temp);
}else{
echo "未找到".$classpath_Temp;
}
}
}
這個類中render方法根據控制層傳來的cname加載相應的view視圖,仔細看$classpath_Temp = ROOT.DS."app".DS."Templates".DS.$this->cname.DS.$this->method.".php";這段代碼,意思是選擇
Templates目錄cname目錄下的method.php文件,也就是說在Templates目錄下創建控制器名為子目錄,方法名為文件的view視圖
這樣視圖和控制層我們已經完成,涉及到對數據庫的操作,我們可以像TP那樣定義一個全局函數M來訪問數據庫,在commone.php中添加一個M函數
function M($name){
return new Model($name);
}
打開
Database類,添加對數據庫的常用操作
class Database{
protected $_dbHandle;
protected $_result;
protected $_table;
/** 連接數據庫 **/
function connect($address, $account, $pwd, $name) {
$this->_dbHandle = @mysql_connect($address, $account, $pwd);
if ($this->_dbHandle != 0) {
if (mysql_select_db($name, $this->_dbHandle)) {
return 1;
}else {
return 0;
}
}else {
return 0;
}
}
/** 中斷數據庫連接 **/
function disconnect() {
if (@mysql_close($this->_dbHandle) != 0) {
return 1;
} else {
return 0;
}
}
/** 查詢所有數據表內容 **/
function selectAll() {
$query = 'select * from `'.$this->_table.'`';
return $this->query($query);
}
/** 查詢數據表指定列內容 **/
function select($id) {
$query = 'select * from `'.$this->_table.'` where `id` = \''.mysql_real_escape_string($id).'\'';
return $this->query($query, 1);
}
/** 自定義SQL查詢語句 **/
function query($query, $singleResult = 0) {
$this->_result = mysql_query($query, $this->_dbHandle);
if (preg_match("/select/i",$query)) {
$result = array();
$table = array();
$field = array();
$tempResults = array();
$numOfFields = mysql_num_fields($this->_result);
for ($i = 0; $i < $numOfFields; ++$i) {
array_push($table,mysql_field_table($this->_result, $i));
array_push($field,mysql_field_name($this->_result, $i));
}
while ($row = mysql_fetch_row($this->_result)) {
for ($i = 0;$i < $numOfFields; ++$i) {
$table[$i] = trim(ucfirst($table[$i]),"s");
$tempResults[$table[$i]][$field[$i]] = $row[$i];
}
if ($singleResult == 1) {
mysql_free_result($this->_result);
return $tempResults;
}
array_push($result,$tempResults);
}
mysql_free_result($this->_result);
return($result);
}
}
/** 返回結果集行數 **/
function getNumRows() {
return mysql_num_rows($this->_result);
}
/** 釋放結果集內存 **/
function freeResult() {
mysql_free_result($this->_result);
}
/** 返回MySQL操作錯誤信息 **/
function getError() {
return mysql_error($this->_dbHandle);
}
}
添加Model類繼承Database類
class Model extends Database{
function __construct($tableName) {
$this->connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
$this->_table = $tableName;
}
function __destruct() {
}
}
這樣MVC的雛形基本完成了,接下來我們來測試一下,我們可以創建一個IndexController控制器類,然后在Templates下 創建一個Index目錄和index.php文件
創建一個數據庫,創建一個user表,我們用IndexController來查詢表
class IndexController extends Controller{
function index(){
$user = M("user");
$arr = $user->selectAll();
print_r($arr);
}
}想要PHP和html分離,我們可以使用smarty框架,可以參考
http://www.cnblogs.com/languoliang/articles/2850276.html這篇文章整合
更多推荐




所有评论(0)