搜尋
首頁後端開發PHP問題如何用PHP搭建自己的web框架?

這篇文章給大家一分鐘學會如何用PHP搭建自己的web框架? (分享)有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

如何用PHP搭建自己的web框架?

        這裡講的WEB是指在apache下運作的PHP WEB程式。

        首先要瞭解PHP在apache下的運作機制和請求的生命週期。

        PHP是腳本語言,它的執行過程是從文件入口,一直到文件的最後的結尾,其中可以包含或引用其它文件,是面向過程的。在過程當中,可以使用物件來實現各種需要的邏輯處理。你可以把一個或多個物件拿來完成所需要的功能,你也可以告訴一個物件你要完成什麼功能,這是物件導向的開發方法,也是普遍的開發方法。所以,在過程導向的運作機制中,使用物件導向的開發方式。

        每個HTTP請求的生命週期也是從入口開始,直到程式結束,其中的變數將不復存在,不同的HTTP請求的變數都是獨立互不影響的。我們可使用global聲明、$GLOBALS全域數組變數、static靜態變數在相同HTTP請求中共享資料;使用session來實現會話層級的共用;使用快取來實現網站全域資料共用。 global聲明一般在方法中,在過程導向的開發中使用,平時不會用到。 $GLOBALS和static經常會用到,但不能直接操作,而是在物件或專門的方法來管理,例如常用的單例模式使用$GLOBALS和static保存。

        PHP程式中,我們都會考慮盡量讓框架簡潔、有效率、清晰、易用,這對開發和維護都很有好處。

        基本的程式模式使用MVC模式,分層分模組、同時需要一個好用的URL router配合MVC。

        URL router:很關鍵的一個元件,決定著原始碼檔案的組織架構、程式碼的清晰度。一個好的router,可以方便找到邏輯入口,體現框架的易用性。   

        Model: 一直使用陣列。用數組主要擔心數組內容不清楚,在項目中,屬性參考資料庫字段,因此數組內容還是相對明確的,Model的操作使用資料存取層DAO封裝。資料庫存取中,直接轉換為數組形式,也比較有效率。對於其它系統的交互資料對象,一般有介面文檔定義。對於ORM中的Active Record技術,能不用或不用的好。

        View: 開始使用smarty,但在效能報告中,smarty執行的方法耗時佔太多太多,後來使用tmd_tpl,就一個文件,簡單易用高效,易修改。在視圖模板中,結合PHP語法,並輔於模板變數。 MVC的思想是分離,不代表不能在View中使用PHP語法。如果是API接口,可以直接把資料轉換為具體格式結果並返回。

        Controller: 或action,代表一個行為、一個方法、一個介面。只有一層的controller往往是不夠用的,一般要分成介面層、業務層、資料存取層,可能還要通訊層。介面負責參數校驗、存取權限控制,呼叫特定的業務,最後回傳資料或顯示頁面等。所有的業務最好都以介面層開始,在這之前應只做框架方面的事情,當我們需要閱讀某個業務實現時,只要順著接口層入口開始讀取即可。業務層是執行實際的業務功能,業務層從資料存取層取得資料並進行業務上加工處理。數據存取層從資料庫或呼叫介面取得數據,可進行簡單的數據轉換處理。如果PHP只是作為資料展示前端,後端由C/C /GO等執行業務,那隻需要封裝業務層,在業務層裡把資料請求到後端,然後回傳給介面層。

                

#

        以上是程序的基本架構結構,或是業務的流程結構,通常是作為系統最重要的部分。但離實用還有距離,還有很多基礎功能要增加,例如session的處理,資料庫訪問,日誌處理等功能。這些基本功能一般是可以獨立於框架的,可以在不同的框架上應用。功能類別不要與框架耦合太緊,一般使用組合方式。我們將這些基礎功能按照用起來順手的方式封裝成核心類,使用單例或多例來調用,或對類進一步封裝成全域使用的方法,方便使用。


        如上圖,中心掌握好、梳理好了,體現的是業務能力,因為隨著業務發展,自然會形成業務分層的結構;而周邊結合得好,體現的是框架能力,如何用得/開發得舒適順手的問題。

        呼叫功能類別或業務類別時,都會涉及類別的載入或匯入問題。那是否使用自動載入功能呢?根據個人體驗和IDE支援程度,我覺得不直觀,對IDE不友好,如F3找不到定義的方法,這是我們開源系統學習的感受,還有對效能的影響。還是直接require/include方便,雖然多寫了一些程式碼,但確實對開發維護閱讀帶了極大的方便(除了修改名稱後導致引用變更不很方便,但可透過全域搜尋來修改)。一些公共的類別在入口裡全域引用,業務類別按需引用。性能損失?因為業務大部分時候都是垂直的,一般使用require/include即可,不需要require_once/include_once,即使多使用幾個once也沒什麼關係,首先可保證正確性,且程序總體性能不是這個決定的。自動載入會增加很多判斷、指令還有堆疊操作,檔案的尋找、損失的效能更多吧。不過一個好的自動加載實作還是可以考慮引入的,業務類的文件可以考慮,框架性的文件不使用自動加載,並且要簡單、定位準確、高效、避免重複。

         載入後怎麼使用?方法、類別物件方法還是類別靜態方法呼叫?根據不同的場景決定。全域功能一般是方法調用,如thinkPHP取得配置內容的C方法,直接調用。如果在分層中,介面層->業務層->資料存取層,使用類別靜態方法呼叫。一些全域功能操作,如資料庫操作類、一些第三方功能類、多型功能類,這些一般使用單例來使用,不需要多次產生新物件。

        關於反射功能,註解,IOC,面向切面程式設計等在其它語言中很有用的功能和實踐,在PHP也基本能實現,雖然也看了很多實踐例子,但並沒有考慮運用到專案之中,能實現並不代表一定要用。 LAMP能方便地開發一個網站,且一般是做網站應用,與做一個框架(如spring)是有區別的,因此對PHP的使用更多是關注網站的業務流程及其性能上,使業務流程清晰易於維護,使彈性不至於複雜化業務、損害效能。高效能網站需要短平快,更何況很多網站是PHP做前端渲染,c/c /java做後台業務,所以PHP網站就應盡量簡單。因為我們是一個業務網站系統,業務流程是確定的,執行是從頭到尾的,體現在代碼上是業務代碼要清晰的,如果在執行過程中被反射了一把,注入了一把,會影響人對業務的理解,同時開發維護BUG定位的時候也可能忽略框架動了什麼手腳。不像一些通用的框架或第三方包,需要足夠的靈活供調用,靈活性就比較繞,還要犧牲一定的性能。使用這些功能,往往事先都要做一些初始化程式碼,或是一些設定初始化,並且每個HTTP請求都要執行一次,即使再簡單的功能,沒有必要,不像java只初始化一次。例如一些restfull框架會在入口處定義路由,還有大量的配置,這個雖然有一定的清晰靈活度,但這種情況下建議使用約定優於配置的想法。

       以上的一些做法有些與眾不同或極端,但是也是經歷過原始-->框架(高級特性,技巧)-->回歸原始的過程,可以理解為個人的獨特感受或經驗。使用PHP的基本特性,從專案著手、業務流程理解、到開發維護,都使人輕鬆。性能方面沒有過多損耗,也能方便定位優化。總之原始簡單是對效能最好的提升;業務垂直隔離地編寫,一眼就看出做了什麼是對開發效率的提升。

       如果一開始沒有能力按專案要求開發自己的PHP框架,那麼在第一次使用一個框架後,在其它專案中就應考慮自己按需實現網站,並形成自己的框架。

       我覺得最簡單好上手的PHP網站框架,需要一個路由、一個控制器來配合一個視圖模板引擎。其它功能模組則按需添加。

        推薦學習:《PHP影片教學

以上是如何用PHP搭建自己的web框架?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器