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

Table des matières
前言
準(zhǔn)備
設(shè)計(jì)
表達(dá)式
實(shí)現(xiàn)
Expressions
接口
魔術(shù)方法
關(guān)系
項(xiàng)目
DEMO
Maison développement back-end tutoriel 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ù)庫了一樣?。。√貏e是中間自己使用一些簡單的說不上框架的東西來寫微型的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)勁。
    相對而言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。

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    Video Face Swap

    Video Face Swap

    échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

    Article chaud

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Sujets chauds

    Tutoriel PHP
    1502
    276
    Porce de variable PHP expliquée Porce de variable PHP expliquée Jul 17, 2025 am 04:16 AM

    Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

    Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Jul 08, 2025 am 02:37 AM

    Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

    Commentant le code en php Commentant le code en php Jul 18, 2025 am 04:57 AM

    Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

    Comment les générateurs fonctionnent-ils en PHP? Comment les générateurs fonctionnent-ils en PHP? Jul 11, 2025 am 03:12 AM

    AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

    Conseils pour écrire des commentaires PHP Conseils pour écrire des commentaires PHP Jul 18, 2025 am 04:51 AM

    La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

    Apprendre PHP: un guide du débutant Apprendre PHP: un guide du débutant Jul 18, 2025 am 04:54 AM

    Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

    Comment accéder à un caractère dans une cha?ne par index en php Comment accéder à un caractère dans une cha?ne par index en php Jul 12, 2025 am 03:15 AM

    En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

    Tutoriel d'installation rapide PHP Tutoriel d'installation rapide PHP Jul 18, 2025 am 04:52 AM

    Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

    See all articles