PHP框架原理

  本文主要來聊聊框架理論,但不針對任何一款框架,不過任何一款框架都離不開這個理論,首先咱們瞭解下框架的前因後果,任何技術的出現都是爲了解決某個問題,以前的博客有講過smarty,其存在就是爲了html和php更好地分離開來。而所謂的「框架」是一種爲了統一書寫格式,訪問方式而進行的自我約束行爲,其實按照這個說法咱們每一個人基本上都或多或少的使用過本身定義的框架,好比說在沒使用框架以前本身開發一個項目,有時候是一天沒法完成的,咱們爲了防止混亂,爲了更好地記憶咱們會進行目錄規劃和程序的規劃,潛意識的把程序分類,放到不一樣的文件夾,因而框架應運而生了,又好比說咱們曾經作了一個CMS系統,若是咱們又接手一個相似的項目,你會重複書寫代碼嗎,答案確定不會,但若是是別人的項目你拿來改實際上是一件很蛋疼的事情的,由於你根本不知道他的這個CMS的規則是什麼,即便是本身的項目時間久了若是本身沒有固定的規範的話也是很容易忘記的,那麼怎麼樣才能保證本身每次寫的代碼均可以按照必定的規範呢,把每一個項目要用的東西挑出來,目錄結構挑出來,之後不管什麼項目都在這個基礎上書寫,那麼屬於本身的框架就出來了。php

  但框架單純這樣是不完善的,那麼框架應該有哪些能力呢,與其這樣說咱們不妨想一想咱們平時必定會寫的代碼必定會作的事情是什麼呢,首先解決的是什麼呢,爲了減小路徑問題,目錄結構的安排其實很重要,有時候文件包含 再進行文件的移動老是一件很蛋疼的事情,最好的辦法是什麼呢,絕對路徑,但同時存在了一個相似E:\www 這樣的問題,但這個值咱們能夠經過預約義變量$_SERVER["DOCUMENT_ROOT"]得到,咱們能夠將其定義爲常量,define("ROOT_PATH", $_SERVER["DOCUMENT_ROOT"]);include ROOT_PATH . "/lib/mysql.php";相似這樣的文件夾怎麼移動都不會有事的,那麼就出現了一個固定的寫法,爲了解決路徑問題而存在的寫法,幾乎每一頁都會用到,還有模板的輸出,數據庫的鏈接,那麼咱們能夠把這些代碼封裝起來,或者分離出來,每一頁包含便可,被分離的這些部分其實就是一個小框架,爲何這麼說呢,若是咱們包含它們進來,例如smarty模板,確定是實例化好的對象,那個量名已經固定,多是$smarty 若是咱們包含了這麼個文件進來,這個量就不能再次進行賦值使用,這樣下面部分的代碼就沒法進行使用了,因爲包含的類,如數據類 上傳類 圖像類 分頁類 位置已經寫死在這個公共文件裏,爲了避免改代碼 這個目錄就成了必須存在的了,目錄格式固定,編寫代碼方式的約束,這就造成了框架。 html

  多年來的程序員的總結交流及開發經驗,你們總結了一些優秀的編寫方式,最經典的是單點入口,什麼是單點入口呢,以前咱們總結了一些幾乎每一個程序都要用到的功能,這裏依然存在一些問題,例如 在公共文件包含以前咱們仍是不知道根目錄是多少,若是咱們在每個文件夾下面都放一個公共文件存在代碼重複問題,哪天修改的話須要所有修改,須要找到須要多少個這樣的文件,如今是多個程序包含一個程序,而後用戶訪問n個程序來完成各個功能,因而程序員就想可不能夠反過來我用一個程序包含這些不一樣功能的程序,用戶只訪問這個程序就能夠了呢,因而單點入口模式出現了,在網站首頁的 index.php 寫上每一個程序都要用的部份 而後跟據某個量,好比一個 get 量來判斷當前實際要執行的程序是哪個,由 index.php 把它包含進來運行,這種由一個程序。完成全部功能的方式,稱爲 單點入口, 因而由這個入口程序和它對應的各個目錄結構成爲了一個框架。mysql

  出於安全在包含文件的時候每每都會固定目錄,否則就容易出漏洞 因此,每每會在路徑頭尾加個限制。例如程序員


<?PHP
include "./app/" . $_GET['url'] . ".php";
?> 

那路徑就只能寫成相似這樣index.php?url=news/list,實際包含的是 /app/news/list.php 固然了,實際的狀況,還要檢查一下這個程序文件是否存在之類的。 sql

 完整一點的話。咱們能夠這樣寫這個入口文件。
<?php

//這裏寫絕對路徑

//這裏寫數據庫鏈接

//這裏寫模板初始化,配置

//這裏判斷鏈接變量

//這裏包含文件進來運行

//這裏輸出模板

//這裏關閉數據庫
?> 
 一個面向過程的單點入口框架就完成了, 是否是有以爲每次都在地址欄帶一個 get 不方便? 那咱們能夠換一個寫法,例如 tp 框架最喜歡用的 http://localhost/index.php/news/list後面的 /news/list 由程序轉成 php 路徑包含進來就能夠了。在 Apache 環境中,這個 /news/list 能夠由服務器變量的 PATH_INFO 取得,若是沒有的話。也能夠用 REQUEST_URI 取得接近的 ,IIS 下面,有 HTTP_X_REWRITE_URL 能夠取得這個值 ,自從單點入口模式出現以後,並且oop開發模式從php5開始大行其道,各類oop設計的框架讓咱們眼花繚亂,可是萬變不離其宗,依然是什麼入口方式,路徑結構是什麼樣的,文件名的命名規則,用什麼樣的訪問方式,能夠運行哪一個程序。用oop開發的框架,不外乎就是把主程序改寫成爲了一個類,

例如:數據庫

//包含共用文件,實例化各個類啥的
頁面->初始化(); 安全

//把用戶發來的網址轉成要包含的路徑
頁面->處理網扯(); 服務器

//在這裏包含程序運行
頁面->運行()app

//輸出模板
頁面->輸出()框架

各類各樣的框架只是爲咱們準備了一個規矩罷了。。在咱們的開發累計的過程當中,咱們經常會把一些經常使用的類封裝成類,例如,數據庫類,文件上傳類,圖片處理類,郵件收發類,遠程訪問類,各類接口類……這個時候,咱們就會但願框架能給咱們提供一個好一點調用類的方法, 也就是所謂的「擴展性」 ,好比 TP 框架的 Db 類 。若是不用其自帶的類庫只用它們的核心框架,其實幾個文件就夠了。
 TP 框架支持三種訪問格式。
/news/list
/index.php/news/list
/index.php?m=news&a=list 
第一種須要服務器的 urlrewrite 支持,後面兩種能夠直接用,
 事實上,Zend 框架也差很少 文件的包含方式是。以類的形式包含,執行的實際上是:/文件夾/對象/方法,這種作法有優點。由於在同一個功能中,類似的代碼不少,封裝到同一個類裏面,能夠更高效的重複使用代碼 ,
好比這樣

class NewsAction {
    public function head() {
        在這裏處理每一頁頭部
    }

    public function index() {
        $this->head();
        在這裏處理這一頁
    }

    public function show() {
        $this->head();
        在這裏處理這一頁
    }

還能夠利用構造函數等,使每個功能,在剛進來的時候就都作了同一件事情。以上就是簡單框架的理論。

相關文章
相關標籤/搜索