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

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

Jun 16, 2021 am 09:27 AM

這篇文章給大家一分鐘學會如何用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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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