首頁  >  文章  >  後端開發  >  如何用PHP搭建自己的web框架?

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

慕斯
慕斯轉載
2021-06-16 09:27:382799瀏覽

這篇文章給大家一分鐘學會如何用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.net。如有侵權,請聯絡admin@php.cn刪除