亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
搭建自己的PHP框架心得(二),搭建php框架心得
續(xù)言
回調(diào)函數(shù)
VIEW層和ob函數(shù)
類__URL__常量和全局類
用單例模式定義數(shù)據(jù)庫連接基類
DB類的sql查詢函數(shù)
后續(xù)
首頁 后端開發(fā) php教程 搭建自己的PHP框架心得(二),搭建php框架心得_PHP教程

搭建自己的PHP框架心得(二),搭建php框架心得_PHP教程

Jul 12, 2016 am 08:55 AM
php

搭建自己的PHP框架心得(二),搭建php框架心得

續(xù)言

對于本次更新,我想說:

  • 本框架由本人挑時(shí)間完善,而我還不是PHP大神級的人物,所以框架漏洞難免,求大神們指出。
  • 本框架的知識(shí)點(diǎn)應(yīng)用都會(huì)寫在博客里,大家有什么異議的可以一起討論,也希望看博客的也能學(xué)習(xí)到它們。
  • 本次更新,更新了函數(shù)規(guī)范上的一些問題,如將函數(shù)盡量的獨(dú)立化,每一個(gè)函數(shù)盡量只單獨(dú)做好一件事情,盡量減少函數(shù)依賴。還對框架的整體優(yōu)化了一下,添加了SQ全局類,用以處理全局函數(shù),變量。

再次貼出GITHUB地址:Sqier框架GITHUB地址


回調(diào)函數(shù)

替換了很low的類名拼裝實(shí)例化,然后拼裝方法名的用法,使用PHP的回調(diào)函數(shù)方式:

原代碼:

<code>$controller_name = 'Controller\\' . self::$c_name;
$action_name = self::$a_name . 'Action';
$controller = new $controller_name();
$controller->$action_name();
</code>

修改后代碼

<code>    $controller_name = 'Controller\\' . self::$c_name;
    $controller = new $controller_name();
    call_user_func([
        $controller,
        self::$a_name . 'Action'
    ]);
</code>

這里介紹一下PHP的函數(shù)回調(diào)應(yīng)用方式:call_user_func和call_user_func_array:

<p>call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )</p>
<p>調(diào)用第一個(gè)參數(shù)所提供的用戶自定義的函數(shù)。</p>
<p>返回值:返回調(diào)用函數(shù)的結(jié)果,或FALSE。</p>

call_user_func_array()的用法跟call_user_func類似,只不過傳入的參數(shù)params整體為一個(gè)數(shù)組。

另外,call_user_func系列函數(shù)還可以傳入在第一個(gè)參數(shù)里傳入匿名參數(shù),可以很方便的回調(diào)某些事件,這些特性在復(fù)雜的框架里應(yīng)用也十分廣泛,如yii2的事件機(jī)制里回調(diào)函數(shù)的使用就是基于此。


VIEW層和ob函數(shù)

框架在controller的基類中定義了render方法來渲染頁面,它會(huì)調(diào)用類VIEW的靜態(tài)函數(shù)來分析加載對應(yīng)頁面的模板。

<code>public static function display($data, $view_file) {

    if(is_array($data)) {
        extract($data);//extract函數(shù)解析$data數(shù)組中的變量
    }else {
        //拋出變量類型異常
    }

    ob_start();
    ob_implicit_flush(0);
    include self::checkTemplate($view_file);//自定義checkTemplate函數(shù),分析檢查對應(yīng)的函數(shù)模板,正常返回路徑
    $content = ob_get_clean();

    echo $content;
}
</code>

這里重點(diǎn)說一下ob(output buffering)系列函數(shù),其作用引用簡明代魔法的ob作用介紹:

  • 防止在瀏覽器有輸出之后再使用setcookie,或者h(yuǎn)eader,session_start函數(shù)造成的錯(cuò)誤。其實(shí)這樣的用法少用為好,養(yǎng)成良好的代碼習(xí)慣。
  • 捕捉對一些不可獲取的函數(shù)的輸出,比如phpinfo會(huì)輸出一大堆的HTML,但是我們無法用一個(gè)變量例如$info=phpinfo();來捕捉,這時(shí)候ob就管用了。
  • 對輸出的內(nèi)容進(jìn)行處理,例如進(jìn)行g(shù)zip壓縮,例如進(jìn)行簡繁轉(zhuǎn)換,例如進(jìn)行一些字符串替換。
  • 生成靜態(tài)文件,其實(shí)就是捕捉整頁的輸出,然后存成文件,經(jīng)常在生成HTML,或者整頁緩存中使用。

它在ob_start()函數(shù)執(zhí)行后,打開緩沖區(qū),將后面的輸出內(nèi)容裝進(jìn)系統(tǒng)的緩沖區(qū),ob_implicit_flush(0)函數(shù)來關(guān)閉絕對刷送(echo等),最后使用ob_get_clean()函數(shù)將緩沖區(qū)的內(nèi)容取出來。


類__URL__常量和全局類

TP里的__URL__等全局常量用著很方便,可以很簡單的實(shí)現(xiàn)跳轉(zhuǎn)等操作,而定義它的函數(shù)createUrl函數(shù)我又想重用,于是借鑒YII的全局類定義方法:

定義基類及詳細(xì)方法(以后的全局方法會(huì)寫在這里)

<code>class BaseSqier{
    //方法根據(jù)傳入的$info信息,和當(dāng)前URL_MODE解析返回URL字符串
    public static function createUrl($info = '') {
        $url_info = explode('/', strtolower($info));
        $controller = isset($url_info[1]) ? $url_info[0] : strtolower(CONTROLLER);
        $action = isset($url_info[1]) ? $url_info[1] : $url_info[0];
        switch(URL_MODE){
            case URL_COMMON:
                return "/index.php?r=" . $controller . '/' . $action;
            case URL_REWRITE:
                return '/' .$controller . '/' . $action;
        }
    }
 }
</code>

在啟動(dòng)文件中定義類并繼承基類;

<code>require_once SQ_PATH.'BaseSqier.php';
class SQ extends BaseSqier{
}
</code>

在全局內(nèi)都可以直接使用SQ::createUrl()方法來創(chuàng)建URL了。這樣,定義__URL__常量就很輕松了。


用單例模式定義數(shù)據(jù)庫連接基類

<code>class Db {
    protected static $_instance;
    public static function getInstance() {
        if(!(self::$_instance instanceof self)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function __construct() {
        $link = new \mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME) or die("連接數(shù)據(jù)庫失敗,請檢查數(shù)據(jù)庫配置信息!");
        $link->query('set names utf8');
    }
    public function __clone() {
        return self::getInstance();
    }
}
</code>

使用單例模式的核心是:

  • 私有化構(gòu)造函數(shù),使無法用new來創(chuàng)建對象,也防止子類繼承它并改寫其構(gòu)造函數(shù);
  • 用靜態(tài)變量存放當(dāng)前對象,定義靜態(tài)方法來返回對象,如對象還未實(shí)例化,實(shí)例化一個(gè),存入靜態(tài)變量并返回。
  • 構(gòu)造其__clone魔術(shù)方法,防止clone出一個(gè)新的對象;

DB類的sql查詢函數(shù)

DB查詢函數(shù)是一個(gè)很復(fù)雜的部分,它是一個(gè)自成體系的東西,像TP和YII的查詢方法都有其獨(dú)特的地方。我這里暫時(shí)先借用TP的MODEL基類,有時(shí)間再慢慢補(bǔ)這個(gè)。

嗯,介紹一下像TP的查詢里的方法聯(lián)查的實(shí)現(xiàn),其訣竅在于,在每個(gè)聯(lián)查方法的最后都用 return this 來返回已處理過的查詢對象。


后續(xù)

yii2里的數(shù)據(jù)表和model類屬性之間的映射很酷(雖然被深坑過), 前面一直避開的模塊(module,我可以想像得到把它也添加到URI時(shí)解析的麻煩)有時(shí)間考慮一下。

邊寫邊優(yōu)化。

嗯,待續(xù)... 對了,宣傳一下自己的個(gè)人站:www.alwayscoding.cn 我的聯(lián)系方式在留言板頁面的右側(cè),有問題可以在那里交流。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1116381.htmlTechArticle搭建自己的PHP框架心得(二),搭建php框架心得 續(xù)言 對于本次更新,我想說: 本框架由本人挑時(shí)間完善,而我還不是PHP大神級的人物,所...
本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驅(qū)動(dòng)投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

漫天星漫畫完整版入口_滿天星漫畫去廣告特別版鏈接 漫天星漫畫完整版入口_滿天星漫畫去廣告特別版鏈接 Sep 28, 2025 am 10:30 AM

漫天星漫畫完整版入口為https://www.mantianxingmh.com,平臺(tái)涵蓋熱血、戀愛、懸疑、科幻等多種題材,資源豐富且更新及時(shí),支持分類檢索;提供高清畫質(zhì)、多種翻頁模式、自定義背景與亮度調(diào)節(jié),具備護(hù)眼模式優(yōu)化閱讀體驗(yàn);用戶可創(chuàng)建書架、保存閱讀記錄、離線下載并實(shí)現(xiàn)跨設(shè)備同步進(jìn)度。

如何在PHP中使用面向?qū)ο蟮木幊蹋∣OP)? 如何在PHP中使用面向?qū)ο蟮木幊蹋∣OP)? Sep 28, 2025 am 03:26 AM

oopinphporganizesCodeIntOrsableClassesandObjects.1.ClassesdefinePropertiesandMethods,IntantiatedVia $ this.2.Constructors(__構(gòu)造)initializeObjectsproperties.3.accessmodifiers(公共,私人,私人,procected)ControlVisibility.4.Inheritance(Hersheritance(Extents))允許

如何在PHP MySQL中獲取最后一個(gè)插入的ID? 如何在PHP MySQL中獲取最后一個(gè)插入的ID? Sep 28, 2025 am 05:57 AM

使用mysqli_insert_id()(過程風(fēng)格)、$mysqli->insert_id(對象風(fēng)格)或$pdo->lastInsertId()(PDO)可獲取最后插入的ID,需在同連接中立即調(diào)用以確保準(zhǔn)確性。

如何在PHP中使用最終類和方法? 如何在PHP中使用最終類和方法? Sep 28, 2025 am 05:55 AM

finalClassEndMethodsInphpprevEntinHeritanceanDoverRidingToprotectecticalCode.2.afinalClassCannotBexended,確保behaviormainsunchanged.3.afinalmethodcannodcannodcannodcannodcannotbeoverridden,preserervingConsistentImpplementImpplementActatimpplentatimplectationAccsSssSssSsSsSsSsSsSsSsSsSsseClass.4.4.usefinalfinalfinalfinalfinalfinalfilitfinalfilit

如何在PHP中回聲HTML標(biāo)簽 如何在PHP中回聲HTML標(biāo)簽 Sep 29, 2025 am 02:25 AM

使用單引號(hào)或轉(zhuǎn)義雙引號(hào)在PHP中輸出HTML,推薦用單引號(hào)包裹字符串以避免屬性引號(hào)沖突,可結(jié)合變量拼接或heredoc語法生成動(dòng)態(tài)內(nèi)容。

如何使用PHP中的GET請求變量? 如何使用PHP中的GET請求變量? Sep 29, 2025 am 01:30 AM

Use$_GETtoaccessURLquerystringvariablesinPHP,suchasname=Johnandage=30fromhttps://example.com/search.php?name=John&age=30;alwaysvalidateandsanitizeinputsusingfilter_input()andavoidsensitivedatainURLsduetoexposurerisks.

什么是特征以及如何在PHP中使用它們 什么是特征以及如何在PHP中使用它們 Oct 02, 2025 am 04:17 AM

特質(zhì)sinphpenablehorizo??ntalcodereusebyAllowingClassobalingMethodMethodSsobabableTraitContainers,旁路lephingsingleinheritancelimits.forexample,theloggabletraitprovidesalog(theloggabletraitprovidesalog)()methodyClassusisitit,suptoyclassusisitit,shisthencuser,shisthencuser,shisthencallencall $ the canthencall $ thiscrigthiscrea thiscreacreacrea

MBTI免費(fèi)測試官網(wǎng)入口_ MBTI測試免費(fèi)網(wǎng)站網(wǎng)址鏈接 MBTI免費(fèi)測試官網(wǎng)入口_ MBTI測試免費(fèi)網(wǎng)站網(wǎng)址鏈接 Sep 28, 2025 am 10:00 AM

MBTI免費(fèi)測試官網(wǎng)入口是https://www.16personalities.com/,該網(wǎng)站提供中英文版本測試,涵蓋性格維度分析、個(gè)性化報(bào)告及多場景應(yīng)用建議,幫助用戶深入了解自身人格類型。

See all articles