国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
前言
準(zhǔn)備
設(shè)計(jì)
表達(dá)式
實(shí)現(xiàn)
Expressions
接口
魔術(shù)方法
關(guān)系
項(xiàng)目
DEMO
首頁 後端開發(fā) php教程 micro activerecord library in PHP(一個(gè)微型的PHP實(shí)現(xiàn)的AR庫)

micro activerecord library in PHP(一個(gè)微型的PHP實(shí)現(xiàn)的AR庫)

Jun 23, 2016 pm 01:25 PM

一個(gè)微型的PHP實(shí)現(xiàn)的AR庫

體積很小帶詳盡的注釋總共只有400行
支持鏈?zhǔn)秸{(diào)用
支持關(guān)系

前言

最開始接觸ActiveRecord是在學(xué)習(xí)Yii的時(shí)候,那個(gè)時(shí)候覺得用AR操作數(shù)據(jù)庫真的是太方便了。以至于后來轉(zhuǎn)向其他的一些框架的時(shí)候,感覺沒有了AR似乎就不能操作數(shù)據(jù)庫了一樣?。?!特別是中間自己使用一些簡單的說不上框架的東西來寫微型的PHP站點(diǎn)的時(shí)候,感覺手寫SQL太難看。
后來也接觸過一些優(yōu)秀的獨(dú)立的ORM的庫,比如我最喜歡的idiorm. 甚至曾經(jīng)萌生了想要把Yii的AR單獨(dú)拿出來用的想法!但是后來還是沒有實(shí)現(xiàn)。。。
在13年的時(shí)候,有一段時(shí)間上班時(shí)間太清閑,所以當(dāng)時(shí)就想自己實(shí)現(xiàn)一個(gè)ActiveRecord類,一來打算練練手,而來也打算自己以后用的上。

準(zhǔn)備

在開始動(dòng)手寫之前,在github,以及stackoverflow上面尋找了一大堆的php的AR庫或者ORM的庫。

  • https://github.com/j4mie/idiorm

  • https://github.com/vrana/notorm

  • https://github.com/PrimalPHP/Record

  • https://github.com/spadgos/Record

  • https://github.com/sgoen/php.pdo.orm

  • https://github.com/jaceju/example-my-orm

  • 當(dāng)然其中最好的就是idiorm以及notorm,在github上門分別有1600+和600+的star。
    拿idiorm來說,個(gè)人非常喜歡它提供的接口以及使用方式。而且整個(gè)庫也就單個(gè)文件,雖然文件將近2500行。但是已經(jīng)算是一個(gè)小型的庫了。當(dāng)然文件有點(diǎn)長,看起來有點(diǎn)費(fèi)勁。
    相對(duì)而言notorm設(shè)計(jì)得更加OO一些。不過在其中的NotORM_Result這個(gè)class中明顯看到一大片字符串拼接SQL的方式,還是讓人覺得看起來不是很好。

    設(shè)計(jì)

    在看了一堆這樣的ORM的庫之后,非常反感那種直接拼接SQL的方式,但是這又是一個(gè)無法避開的問題,最后總是需要生成一個(gè)SQL字符串的。
    關(guān)鍵在于需要找出一種比較”優(yōu)雅“的方式來完成這個(gè)拼接的工作。

    表達(dá)式

    有一天在看拼接的SQL的時(shí)候偶然間感覺SQL里面where后面的那些查詢條件總是一個(gè)一個(gè)的表達(dá)式(一個(gè)操作數(shù)加上一個(gè)操作符再加上一個(gè)操作數(shù),例如:name='demo' and email='demo@demo.com')。

    這個(gè)表達(dá)式的結(jié)構(gòu)看起來和數(shù)學(xué)里面的(1+1)*(2+2)是那么的相像。

    甚至連and,or也是一個(gè)一個(gè)的操作符而已。再提煉一下除了二元表達(dá)式,還有一元表達(dá)式(只有一個(gè)操作數(shù)的表達(dá)式,類似數(shù)學(xué)里面的-1)。這樣算起來SQL里面的select,from,where,delete,update這樣的關(guān)鍵詞都可以算成是”操作符“了。

    那么一個(gè)簡單的SQL就可以分解成一個(gè)一個(gè)的表達(dá)式:

    select email, password from `user` where email = 'demo@demo.com';
  • select email, password

  • from user

  • where email = 'demo@demo.com'

  • email = 'demo@demo.com'

  • 上面的SQL總共拆分出來了4個(gè)表達(dá)式,其中where部分是嵌套的一個(gè)表達(dá)式。

    實(shí)現(xiàn)

    Expressions

    所以,我專門定義了一個(gè)Expressions類用來表示SQL中的各個(gè)部分。這個(gè)類只有一個(gè)__toString方法在最后需要的時(shí)候生成SQL

    class Expressions extends Base {    public function __toString() {        return $this->source. ' '. $this->operator. ' '. $this->target;    }}

    當(dāng)然還有比較特殊的表達(dá)式就是"()",這個(gè)表達(dá)式特殊在于操作符是分開的。

    接口

    當(dāng)提煉出來了表達(dá)式的類之后,那么在使用ActiveRecord查詢數(shù)據(jù)庫的時(shí)候,每輸入一個(gè)動(dòng)詞,都只是在適當(dāng)?shù)牡胤讲迦胍粋€(gè)表達(dá)式而已。只有在最后的時(shí)候才會(huì)一次性的調(diào)用每一個(gè)表達(dá)式的__toString方法組合SQL,為了安全考慮,使用了PDO的綁定參數(shù)的形式防止SQL注入的風(fēng)險(xiǎn)!
    比如:

    $user->equal('id', 1);只是在where子句里面生成了一個(gè) "id=:ph1"的表達(dá)式,同時(shí)保存了一個(gè)array(':ph1'=>1)的參數(shù)而已。同樣的還提供了簡寫的”eq“以及”ne“,”ge“等接口函數(shù)。另外還有”select“,”from“,”group“,”order“,”limit“,”top“以及”where“等接口函數(shù)。

    魔術(shù)方法

    為了減少代碼量,所以這里使用了__call魔術(shù)方法避免了為每一個(gè)動(dòng)作都去定義個(gè)method。

    關(guān)系

    除了實(shí)現(xiàn)SQL的基本操作,還實(shí)現(xiàn)了一下類似Yii的ActiveRecord法讓Relation的方法可以簡單的通過主外鍵關(guān)系查詢數(shù)據(jù)。
    定義了”HAS_ONE“,”HAS_MANY“和”BELONGS_TO“三種關(guān)系。
    可以在定義關(guān)系之后,能通過簡單的的訪問屬性的方式獲得關(guān)聯(lián)的數(shù)據(jù)。

    項(xiàng)目

    項(xiàng)目地址:https://github.com/lloydzhou/activerecord
    文檔地址:https://lloydzhou.github.io/activerecord
    已經(jīng)提交到packagist.org可以通過composer安裝

    composer require lloydzhou/activerecord

    DEMO

    為了一邊測試,一邊完善這個(gè)庫。所以使用這個(gè)庫結(jié)合另外一個(gè)Router和 MicroTpl 寫了一個(gè)簡單的 博客 ,里面基本涵蓋了這幾個(gè)庫的API。

    本網(wǎng)站聲明
    本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)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

    用於從照片中去除衣服的線上人工智慧工具。

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++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版

    神級(jí)程式碼編輯軟體(SublimeText3)

    熱門話題

    Laravel 教程
    1600
    29
    PHP教程
    1502
    276
    PHP變量範(fàn)圍解釋了 PHP變量範(fàn)圍解釋了 Jul 17, 2025 am 04:16 AM

    PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

    如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

    要安全處理PHP文件上傳需驗(yàn)證來源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來源通過token防止CSRF並通過finfo_file檢測真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

    在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

    PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

    發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

    AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

    撰寫PHP評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

    寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

    學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

    易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

    如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

    在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開始,超出範(fàn)圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

    快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

    ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

    See all articles