亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 擴展 > MVC > 正文

解析基于MVC的輕量級PHP框架

2024-09-06 20:44:33
字體:
來源:轉載
供稿:網友
做WEB開發已有一年,每次都寫重復的東西, 因此,想自己寫一下框架,以后開發方便.
本人之前學習asp.NET兩年,JSP半年,可是后來因為工作的原故換成PHP.其實很不喜歡PHP的語法.還有PHP的函數名,每回都忘記..還是喜歡C#和JAVA的語法,哈...不過PHP有PHP的優點,不像ASP.NET那樣封裝了大量的東西,PHP更簡單,更自由吧.還有應該就是PHP的開源組合.
寫這編文章主要是因為那些東西要寫給別人看,順便發表了.高手看了別笑,菜鳥自己注意辨別,別被我的錯誤觀點誤導.
文章中的代碼下載
一.文件結構
├ index.php 入口文件
class 類存放的文件夾
   ├ base.class.php 基類
   ├ error.class.php 錯誤處理類
   ├ parms.class.php 獲取參數類
control.class.php 控制類
model.class.php 模型類
template smartTemplate 類存放文件夾
db adodb 類存放文件夾
includes 包含文件類
├ defines.inc.php 定義各路徑文件
   ├ frameword.inc.php 框架處理文件
   ├ router.inc.php 路由文件,跟據參數,跳轉不同路徑
models 模式存放路徑
views 模版文件保存路徑
controls 存放控制類的文件夾
config.php 配置文件
admin 后臺
二.簡單類圖
 
 
三. 入口文件,index.php
<?php

define("EXEC",1); //初始化一個常量,保存別的文件必須先有這個入口文件的引用.


define('PATH_BASE',dirname(__FILE__)); //獲取入口文件的路徑

define('DS', DIRECTORY_SEPARATOR); //目錄的分隔,’/’ 或’’

define( 'PATH_ROOT', PATH_BASE ); //站點的跟目錄,跟據你的入品文件存放來定義,如果放在子目錄下,則要做相應修改.如下,
//把路徑分組

{parts = explode( DS, PATH_BASE );
//去除最后一個路徑名

array_pop( parts );

define( 'PATH_ROOT', implode( DS, parts
) );}

require_once(PATH_ROOT.DS.'includes'.DS.'defines.inc.php'); //各文件夾的路徑

require_once(PATH_ROOT.DS.'includes'.DS.'framework.inc.php');

echo request->Get('a');//參數的獲取GET方法

request->Post(‘a’);//獲取POST參數

?>
 
 
 
 
 
四. 路徑定義文件 defines.inc.php
<?php
/*
*/
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' ); //如果單獨執行這個文件,將不能執行

//站點路徑
define( 'PATH_SITE', PATH_ROOT );
//包含文件路徑
define( 'PATH_INCLUDE', PATH_ROOT.DS.'includes');
//類文件路徑
define( 'PATH_CLASS', PATH_ROOT.DS.'class' );
//配置文件路徑
define( 'PATH_CONFIG', PATH_ROOT );

?>
 
 
. 框架文件路徑 frameword.inc.php
f
<?php

// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );

//load error class
require_once( PATH_CLASS.DS.'error.class.php'); //包含錯誤處理文件
//load base class
require_once( PATH_CLASS.DS.'base.class.php' ); //包含基類文件

//實例化基類
load=new Base();

//實列化請求類 用于獲取GET或POST
//加截一個自己寫的類的方法
//把自己寫的類放在class 文件夾下面,文件名的格式為demo.class.php
//那么類名就為 class demo{}
//實便化的方式為demo=load->library(‘demo’);
//調用demo類的Get函數則為 demo->Get(‘參數’);

request=load->library('params');
//不同的目錄用不同的URL方式
require_once( PATH_BASE.DS.'includes'.DS.'router.inc.php' );

?>
 
六. 基類函數包含了常用的功能 base.class.php
 
<?php

// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );

class Base extends Error
{

var path_root ='';
var path_class ='';
var path_control ='';

/*/構造函數
*@parame path 應用路徑
*return null
*/
public function Base()
{
this->path_root =PATH_ROOT;
this->path_class =PATH_CLASS;
this->path_control=PATH_BASE.DS.'controls';
}

//加載模型
//load model
function model(name)
{
include_once (this->path_model.DS.name.'.php');

model=null;
if(model==null)
{
model=new name();
}
return model;

}

//output page
/*
*@paramater name file name
*@paramater data replace
*
*/
function view(name,data)
{
Template=self::template(file);
Template->output(data);
unset(Template);
}

//create database connection
function database()
{
iclude_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(self::config('db_host') , self::config('db_user'), self::config('db_password'), self::config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}

//create template
function template(file)
{
include_once (PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
Template = new Smarttemplate(file)
Template->template_dir=PATH_BASE.self::config('template_dir');
Template->cache_dir =PATH_BASE.self::config('cache_dir');

return Template;
}

//import class
function library(className) 
{
if(empty(className))
{
return null;
exit();
}
else
{
require_once(PATH_CLASS.DS.className.'.class.php');
return new className();

}
}

//return config value
function config(parameter)
{
require_once(PATH_CONFIG.DS.'config.php');

return CONFIG::Ini()->parameter;

}

}


?>
 
 
. 控制器父類control.class.php
 
<?php
class Control
extends Base
{
var
request;
function Control()
{
this->request=this->library('params
');
}

//
output page
/*
*@paramater name file name
*@paramater data replace
*
*/

function view(name,data='')
{
Template=this->template(name.'.html
');
Template->assign('site_root',this->config('site_root
'));

Template->assign(
data);
Template
->output();
unset(
Template);
}

//
load model
function model(
name)
{

include_once (PATH_BASE.DS.'models'.DS.name.'.php
');

if(this->model==
null)
{
this->model=new
name();
}
return this
->model;

}

}

?>
八. 模型父類 model.class.php
 
<?php

class Model extends Base
{
var request;
var db;
function Model()
{
this->request=this->library('params');
}

//create database connection
function database()
{
if(this->db!=null)
{
return this->db;
exit;
}
include_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(this->config('db_host') , this->config('db_user'), this->config('db_password'), this->config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}

}

?>
 
 
九. 路由文件, router.inc.php
 
跟據URL,指定到相應的控制器,跟據網站的URL表現形式編寫
<?php
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );

//實例化類
load=new Base();

//實列化請求類 用于獲取GET或POST
request=load->library('params');

//獲取參數
option=@request->get('option');
task =@request->get('task');

//如果未設置文件
if(empty(option))
{
option=load->config('index_router');
}

include_once (PATH_BASE.DS.'controls'.DS.option.'.php');

Control=new option();

if(empty(task))
{
Control->index();
}
else
{
Control->task();
}


?>
 
 
十,使用方法
 
使用方法.
 
視圖V:在把模板文件放在VIEW文件夾里面.命名方式為,login.html
控制C:把要怎么處理的文件放在control文件夾里面,
格式為.demo.php
class demo extends Control
{
function edit()
{
data=this->user->issuer();//調用模型
this->view(‘login’,data);//這個LOGIN為視圖中的login.html文件
}
}
模型 M:把文件放在 model文件夾里面.格式為.user.php
 
class user extends Model
{
function issuer()
{
數據庫或底層的操作,返回結果
}
}
 
 
 
自定義類的調用,把類放在Class文件夾下面.格式為session.class.php
先實例化.
session=load->library(‘session’);
然后再調用類中的函數
session->sessionId();
 
 
例子:
如下URL: http://127.0.0.1/com/admin/?option=test&task=getUser (注:這里的URL格式可以在router.inc.php里面修改.同時為了讓不同目錄的地址格式不一樣,比如前臺和后臺,因些,把router.inc.php規則放在了入口文件的includes目錄下面) 則會調用/admin/control/文件夾下面的test.php文件test類的getUser 函數,如果task參數為空,則調用index函數.
文件:/admin/control/test.php
<?php
class test extends Control
{
function index()
{
}
function getUser()
{
data['user']=this->model('member')->getUser();
this->view('test',data);
}
function reg()
{
if(this->model('member')->isUser())
{
this->Alert(‘用戶名已存在’); //error類中定義了
}
else
{
this->model('member')->addUser();
}
}
}
 
?>
如果this->model('member')這個模型經常用到,可以在引用類的構造函數中初始化,不要每次都實例化.如:
Var member;
function test()
{
this->member=this->model('member');
}
這樣,應用的時候只要. this->member ->addUser();
 
 
 
this->model(‘member’)->getUser();
為調用入口文件相應目錄下的Models 文件夾下面的member.php文件里面的getUser();函數
文件:/admin/models/member.php
<?php
 
class member extends Model
{
function getUser()
{
//return this->db->GetOne("select username from user where userId=1");//這種方式處理數據庫
//this->request->Get(‘test’)
//this->request->Post(‘test’) 這種方式獲取參數,在父類中已定義
return 'admin';
}
 
//驗證用戶名是否已經存在
function isUser()
{
userName=this->request->Post(‘username’);
passWord=this->request->Post(‘password’);
return this->db->GetOne(“select count(*) from user where username=’userName’ and password=’passWord’”);
}
}
 
?>
 
 
this->view(‘test’,data);
顯示視圖,調用/admin/views/test.html文件,用SmartTemplate 類的方式生成 data 為數組
這部份請查看smartTemplate 類的使用方法
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人全部免费| 国产精品美女呻吟| 综合136福利视频在线| 一区二区欧美久久| 国内精品伊人久久| 国产精品十八以下禁看| 日韩精品免费在线| 亚洲www在线观看| 91免费高清视频| 精品国偷自产在线视频| 亚洲日本欧美中文幕| 成人a视频在线观看| 国产婷婷色综合av蜜臀av| 久久不射电影网| 亚洲精品一区二三区不卡| 福利视频导航一区| 国产精品极品尤物在线观看| 性金发美女69hd大尺寸| 日韩av大片在线| 日韩日本欧美亚洲| 国产精品入口日韩视频大尺度| 综合网中文字幕| 欧美性xxxx在线播放| 国产一区二区三区在线观看网站| 黄网站色欧美视频| 亚洲成人a**站| 日韩精品在线私人| 精品国内亚洲在观看18黄| 俺去了亚洲欧美日韩| 日韩精品中文字| 97视频在线观看视频免费视频| 亚洲欧美在线播放| 国产精品扒开腿做爽爽爽男男| 在线观看不卡av| 91视频-88av| 不卡在线观看电视剧完整版| 最新国产精品亚洲| 国产精品视频免费在线观看| 久久精品成人欧美大片| 国产亚洲精品久久久久久牛牛| 久久99精品国产99久久6尤物| 91欧美精品成人综合在线观看| 久久久久久有精品国产| 亚洲天堂免费观看| 国产日产欧美a一级在线| 亚洲综合在线小说| 欧美精品在线免费观看| 日韩国产欧美精品在线| 亚洲一区二区中文| 久久精品亚洲热| 欧美一级视频一区二区| 91国内精品久久| 欧美日韩国产123| 欧美黑人性生活视频| 影音先锋欧美在线资源| 国产精品777| 久久人人看视频| 亚洲自拍偷拍第一页| 亚洲最大的成人网| www.国产精品一二区| 91精品国产91久久久久| 国内精品400部情侣激情| 97精品久久久中文字幕免费| 在线视频日韩精品| 亚洲成av人片在线观看香蕉| 色综合天天综合网国产成人网| 国产视频精品免费播放| 91久久久久久久久久久久久| 国产精品高清免费在线观看| www.欧美精品一二三区| 欧美国产视频日韩| 日韩美女av在线免费观看| 国产精品第1页| 国产精品成人一区二区三区吃奶| 一色桃子一区二区| 日韩在线视频网| 亚洲一区二区三区久久| 久久中文字幕在线| 国产精品99久久久久久www| 精品视频一区在线视频| 精品国产91久久久| 中文字幕日韩欧美在线视频| 狠狠躁夜夜躁久久躁别揉| 欧美电影免费看| 久久久久久久国产精品视频| 911国产网站尤物在线观看| 亚洲91精品在线观看| 欧美wwwxxxx| 26uuu亚洲国产精品| 91精品在线观看视频| 国产精品视频免费在线| 欧美激情精品久久久久久免费印度| 亚洲成人a**站| 精品久久久久久亚洲国产300| 亚洲乱码国产乱码精品精| 热久久视久久精品18亚洲精品| 国产免费久久av| 日日狠狠久久偷偷四色综合免费| 亚洲国产精品推荐| 97精品国产97久久久久久春色| 中文字幕日韩在线播放| 亚洲精品在线91| 久久久久久亚洲| 久久国产精品首页| 国产精品夜色7777狼人| 久久99久久久久久久噜噜| 日本三级久久久| 精品中文字幕视频| 国产精品黄色av| 国产一区二区三区在线| 中文字幕成人精品久久不卡| 日韩av三级在线观看| 日韩欧美国产网站| 一本色道久久88精品综合| 国产精品视频公开费视频| 精品偷拍一区二区三区在线看| 国产精品久久久久久av福利| 精品激情国产视频| 亚洲欧美在线x视频| 992tv成人免费视频| 这里精品视频免费| 久久香蕉频线观| 日韩激情在线视频| 亚洲香蕉成视频在线观看| 欧美成人在线免费| 精品免费在线视频| 亚洲bt天天射| 国产精品黄页免费高清在线观看| 亚洲第一av网站| 高清亚洲成在人网站天堂| 国产精品xxx视频| 亚洲欧洲av一区二区| 国产91色在线| 久久99久国产精品黄毛片入口| 性金发美女69hd大尺寸| 欧美成人精品三级在线观看| 色综合久久天天综线观看| 91成人在线观看国产| 中日韩美女免费视频网站在线观看| 亚洲www在线| 欧美最顶级丰满的aⅴ艳星| 最近免费中文字幕视频2019| 亚洲精品国产精品国自产观看浪潮| 亚洲三级黄色在线观看| 亚洲国产日韩欧美在线动漫| 国产成人精品999| 久久精品2019中文字幕| 国产91久久婷婷一区二区| 久久99精品国产99久久6尤物| 国产精欧美一区二区三区| 亚洲www在线观看| 日韩有码视频在线| 国产精品尤物福利片在线观看| 亚洲男子天堂网| 欧美日韩中文在线观看| 亚洲精品国产精品自产a区红杏吧| 国产在线拍揄自揄视频不卡99| 亚洲天堂av网| 欧美在线观看日本一区| 国产深夜精品福利| 日韩视频免费观看| 亚洲xxxx妇黄裸体| 久久精品久久久久电影| 日本午夜精品理论片a级appf发布|