国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP微型框架設(shè)計

nihao / 1866人閱讀

摘要:這些所有的結(jié)構(gòu)都只是該微型框架的一個基本結(jié)構(gòu),實際上復(fù)雜的框架會有很多擴展的函數(shù)以及外部插件,可以在這個目錄結(jié)構(gòu)上做出相應(yīng)調(diào)整。

一、框架整體分析
在實現(xiàn)一個框架之前,我們需要了解這個框架應(yīng)該達到一個怎樣的效果,按照傳統(tǒng)框架的思路,大致可以總結(jié)出以下這么幾條:
1.實現(xiàn)MVC架構(gòu),將控制、邏輯、視圖層進行分離。
2.封裝各種函數(shù)及功能模塊,實現(xiàn)一處編寫,多處調(diào)用,減少代碼冗余。
3.便于擴展,可方便的引入外部擴展庫,對自身框架進行增強。
4.選好設(shè)計模式,封裝或編寫各種引擎模塊。
基本的框架需求大概就是這個樣子,有了這些需求,接下來就是一個架構(gòu)的設(shè)計,這里面涉及到的很多問題需要解決,下面我們一步步進行一個剖析。

二、框架設(shè)計過程
1.框架目錄
這其實是個很重要的步驟,你的選擇不同,最后目錄結(jié)構(gòu)也會有很大區(qū)別,除了滿足基本的三層之外,擴展庫,前端文件,模版,資源文件等也需要找目錄放置,而這又決定了之后你的調(diào)用是否方便,我此次框架設(shè)計使用了smaty引擎作為視圖引擎,目錄結(jié)構(gòu)大概如下:

這張圖展示出了兩級目錄的一個結(jié)構(gòu),更深入的目錄由于圖片顯示有限就不一一弄出來了,而每個目錄及主要文件的作用會在后文一一說到。

2.目錄介紹
(1)data目錄
可以看到上圖中的目錄結(jié)構(gòu),由于使用了smarty引擎,而在smarty引擎中需要配置緩沖目錄和緩存目錄,因此data目錄的作用就在于此。
(2)framework目錄
該目錄是我們框架的核心所在,db目錄放置了我們的數(shù)據(jù)庫操作函數(shù)庫。function目錄放置了一個function.php的文件,該文件的作用主要為方便以M(‘do’)這樣的模式對各層方法的調(diào)用進行快速實例化。libs目錄放置了框架的核心工廠類文件,如數(shù)據(jù)庫的操作類,視圖操作類,方便外部文件以如DB::funtion()這樣的方式對這里面的方法進行調(diào)用。view放置了smarty視圖引擎。include.list.php則是我們框架在調(diào)用時需要包含的文件,這里通通放在一個數(shù)組里進行保存。pc.php是我們的框架啟動引擎,負責(zé)對我們的各個模塊進行統(tǒng)一初始化,以及對我們的url進行解析處理。
(3)img目錄
用于放置我們的樣式文件、js文件以及其他相關(guān)的資源文件
(4)libs目錄
該目錄和framework下的libs目錄名字雖然一樣,但可以看到,該目錄下放置的是MVC三層中的對應(yīng)業(yè)務(wù)處理內(nèi)容以及一個org擴展目錄,Controller放置控制器、Model放置模型、View放置視圖處理類。
(5)tpl目錄
這個目錄則放置一些模板文件,用于前端展示,可以看到我放置了admin和index兩個目錄,分別用于前臺和后臺的模板文件存放。
(6)admin.php和index.php
一般來說,采用mvc架構(gòu)都會使用單入口模式,而這兩個文件就是單入口模式的入口文件,用以啟動該框架。
(7)config.php
這個基本所有的框架都有,配置文件,包含了比如數(shù)據(jù)庫的配置,smarty引擎的配置,及一些靜態(tài)變量的定義等。
這些所有的結(jié)構(gòu)都只是該微型框架的一個基本結(jié)構(gòu),實際上復(fù)雜的框架會有很多擴展的函數(shù)以及外部插件,可以在這個目錄結(jié)構(gòu)上做出相應(yīng)調(diào)整。

3.框架關(guān)鍵點
(1)控制器動態(tài)調(diào)用
單入口模式通常的url大概類似 index.php?controller=控制器&method=方法,在通過get方法獲取到控制器和方法名之后,我們可以通過如下方式進行動態(tài)初始化

function C($name,$method){
require_once("/libs/Controller/".$name."Controller.class.php");
eval("$obj=new ".$name."Controller();$obj->".$method."();");
}
function M($name){
require_once("/libs/Model/".$name."Model.class.php");
eval("$obj=new ".$name."Model();");
return $obj;
}
function V($name){
require_once("/libs/View/".$name."View.class.php");
eval("$obj=new ".$name."View();");
return $obj;
}

(2)原生方法改造
熟悉smarty的朋友都應(yīng)該知道,smarty有assign和dispaly兩個方法,分別用于注冊變量和將變量輸出到模版文件,但如果同時注冊多個變量會讓我們的代碼變得很冗雜,所以我們嘗試對這兩個方法進行改造

public static function assign($data){
foreach ($data as $key => $value) {
self::$view->assign($key,$value);
}
}
public static function display($template){
self::$view->display($template);
}

我們讓assign方法重寫,讓其可以直接注冊數(shù)組,這樣就減少了我們的后續(xù)代碼量,如果要引入其它外部庫,也可以通過這種方法對原生函數(shù)進行改造來使其更加適用。
(3)文件包含邏輯
本框架的啟動文件為pc.php,因此,包含了pc.php就基本上包含了整個框架所需要用到的文件,先看一下一個入口文件index.php的內(nèi)容。

header("Content-type:text/html;charset=utf-8");
date_default_timezone_set("Asia/Shanghai");
require_once("config.php");
require_once("framework/pc.php");
PC::run($config)

很簡單,包含了配置文件和框架啟動引擎pc.php,然后調(diào)用run方法啟動該框架就可以,再看看pc.php的內(nèi)容

$currentdir=dirname(__FILE__);
include_once($currentdir."/include.list.php");
foreach ($paths as $path) {
include_once($currentdir."/".$path);
}
/**
* 完成一系列的初始化和調(diào)用控制器
*/
class PC
{
public static $controller;
public static $method;
private static $config;
private static function init_db(){
DB::init("mysql",self::$config["dbconfig"]);
}
private static function init_view(){
VIEW::init("Smarty",self::$config["viewconfig"]);
}
private static function init_controller(){
self::$controller=isset($_GET["controller"])?daddslashes($_GET["controller"]):"index";
}
private static function init_method(){
self::$method=isset($_GET["method"])?daddslashes($_GET["method"]):"index";
}
public static function run($config){
self::$config = $config;
self::init_db();
self::init_view();
self::init_controller();
self::init_method();
C(self::$controller,self::$method);
}
}

foreach遍歷包含include.list.php中的所有文件,并將控制器和對應(yīng)方法獲取傳遞給C類進行自動包含。再看一下include.list.php有哪些東西

$paths=$arrayName = array(
"function/function.php",
"libs/core/DB.class.php",
"libs/core/VIEW.class.php",
"db/mysql.class.php",
"view/Smarty/Smarty.class.php"
);

這里面存儲了一個數(shù)組,包含了咱們的兩個工廠類、數(shù)據(jù)庫操作類、外部引擎類、核心function類。
至此,可以梳理一下整個框架對一個url請求的處理流程:

(4)業(yè)務(wù)分離
mvc的核心就在于各層之間的嚴格分離,但Controller層和Model經(jīng)常容易被混淆在一起,這樣會導(dǎo)致mvc架構(gòu)失去原有的意義,我們需要清楚,控制層只實現(xiàn)簡單的控制和邏輯處理,不涉及到具體的業(yè)務(wù)和數(shù)據(jù)交互,所有的具體操作都應(yīng)放到Model層。另外,這兩層中的類名和文件名也應(yīng)保持一致。
(5)方法控制
我們在通過url的形式調(diào)用控制器及方法時,某些方法是不想被外部調(diào)用到的,比如登錄檢查函數(shù),這個時候我們可以通過將函數(shù)定義為私有函數(shù)的方式避免其直接被通過url的形式調(diào)用到,來防止風(fēng)險的發(fā)生。
(6)擴展性設(shè)計
一個框架應(yīng)該具備好的擴展性,尤其對于新外部庫引入,應(yīng)該能很容易通過簡單修改就可以使用,因此應(yīng)該將配置項多帶帶分離存儲。

三、總結(jié)
該框架基本設(shè)計就是這個樣子,很簡單,但基本實現(xiàn)了mvc架構(gòu),雖然和市面上的成熟框架相差很多,但重寫一遍對于mvc的架構(gòu)理解會更加深入,加之如今越來越多的網(wǎng)站都采用的這種單入口mvc架構(gòu),對于這類網(wǎng)站的滲透更需要很好的理解。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22304.html

相關(guān)文章

  • micro activerecord library in PHP(一個微型PHP實現(xiàn)的AR庫)

    摘要:一個微型的實現(xiàn)的庫體積很小帶詳盡的注釋總共只有行支持鏈式調(diào)用支持關(guān)系前言最開始接觸是在學(xué)習(xí)的時候,那個時候覺得用操作數(shù)據(jù)庫真的是太方便了。但是已經(jīng)算是一個小型的庫了。同樣的還提供了簡寫的以及,等接口函數(shù)。 一個微型的PHP實現(xiàn)的AR庫 體積很小帶詳盡的注釋總共只有400行支持鏈式調(diào)用支持關(guān)系 前言 最開始接觸ActiveRecord是在學(xué)習(xí)Yii的時候,那個時候覺得用AR操作數(shù)據(jù)庫真的...

    i_garfileo 評論0 收藏0
  • 你不可不知道的20個優(yōu)秀PHP框架

    摘要:每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個開源的框架。 對于Web開發(fā)者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網(wǎng)站都是基于PHP開發(fā)的。 每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項目之前選...

    zombieda 評論0 收藏0
  • php資料集

    摘要:簡單字符串緩存實戰(zhàn)完整實戰(zhàn)種設(shè)計模式設(shè)計模式是面向?qū)ο蟮淖罴褜嵺`成為專業(yè)程序員路上用到的各種優(yōu)秀資料神器及框架成為一名專業(yè)程序員的道路上,需要堅持練習(xí)學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 微型新聞系統(tǒng)的開發(fā)(PHP 5.4 + MySQL 5.5) 微型新聞系統(tǒng)的開發(fā)(PHP 5.4 + MySQL 5.5) 九個很有用的 PHP 代碼 php 代碼 國內(nèi)值得關(guān)注的...

    RobinQu 評論0 收藏0
  • 轉(zhuǎn):從框架PHP的五種境界及各自的薪資待遇

    摘要:語言行為及特征狀態(tài)看不懂任何英語技術(shù),英語文檔,凡事沒有培訓(xùn)部在搞的,只有英文文檔的東西國內(nèi)一律沒大公司在用,都非主流,排斥英文文檔和新技術(shù),以及各種超出他學(xué)習(xí)能力范圍的技術(shù)。 在撰寫此文前首先必須申明的是本人不鄙視任何一種框架,也無意于挑起PHP框架間的戰(zhàn)爭,更沒有貶低某個框架使用者的用意,本文純粹個人的看法。你可以認為我無知也好,或者裝逼也好,請不要試著在任何情況下,隨便發(fā)起言語的...

    Godtoy 評論0 收藏0
  • 這就是現(xiàn)代php該有的樣子(二)

    摘要:所以,是幫助您創(chuàng)建您的項目的測試框架,單元測試。行為驅(qū)動開發(fā)是一個來自測試驅(qū)動開發(fā)的開發(fā)過程。這種語言被稱為,是用來描述被測試的預(yù)期的行為。代碼將被測試并且沒有異常。這些標準提出了現(xiàn)代編碼風(fēng)格。 本文來自medium----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 你需要開始使用測試 這是我每天對自己說的話。像很多人一樣,我不會像TDD所建議的那樣測試...

    fevin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<