自研 PHP 框架 1.0_index.php 檔案說明

student33發表於2019-12-22

index.php說明

在服務上,PHP 引擎其實只執行了 index.php 這一個檔案,index.php 可以抽象的看做是產品的最終型態,app 下的檔案規定如何組裝,system 下的檔案提供基本的“組裝零件”,最後拼裝成一個完整的產品,這就是 index.php。

下面參考 index.php 中的具體實現來一一說明:

<?php

// 引入路由解析檔案
include('./system/url.php');
// 引入常量定義檔案
include('./system/constant.php');
// 引入框架函式庫
include('./system/function.php');

// 解析陣列拿到路徑
url::analyse($_SERVER);

$obj = new url();
// 載入指定檔案
include(APP.$obj->get('path').EXT);

$class_name = $obj->get('controller');
$func = $obj->get('func');

$app = new $class_name();
$app->$func();

在設計過程中,最初的劃分其實是這樣的:

<?php
1.框架環境載入

2.框架功能執行

3.應用功能執行

抽象的看,index.php 由如上的幾個部分構成,按照規劃,進一步細分就有了最上面的具體實現。


檔案引入

需要說明,檔案的引入順序並不重要,這些只是準備工作,誰前誰後,並沒有什麼區別。

要使用工具前必須要先準備工具。前面所說的檔案引入順序並不重要,強調的是所有引入檔案之間的順序並沒有關聯關係。但是,引入檔案必須要在具體的執行邏輯之前,比如,下面這種寫法就是錯誤的

<?php
// 解析陣列拿到路徑
url::analyse($_SERVER);

// 引入路由解析檔案
include('./system/url.php');
// 引入常量定義檔案
include('./system/constant.php');
// 引入框架函式庫
include('./system/function.php');

錯誤的原因在於,使用了還沒有引入的功能元件,url::analyse($_SERVER) 執行時,url 類還不存在。理解這一點,需要一些更基礎的知識。

計算機如何執行

眾所周知,計算機的核心是 CPU(此處僅用來進行簡略的說明,不需要的內容都被省略,更詳盡的基礎知識請參考其他權威資料)。

CPU 只能做以下簡單的事情:

  • 從暫存器讀取資料;
  • 計算;
  • 將結果寫入暫存器。

一個指令碼在被載入記憶體(記憶體是一種特殊的暫存器)之後,CPU 會從頭開始一條一條讀取指令碼並執行,CPU 只能夠識別機器碼(0100101111001....00011001,類似這樣的由 0 和 1 組成的長串),所以 index.php 在執行之前先要進行翻譯,編譯成 CPU 能夠識別的機器碼,編譯過程也是一一對應,並不會打亂順序,編譯之後的機器碼可能是這樣

0100 1110
0011 1011
...
0010 0001
1111 1111
...

指令碼(index.php)的一行可能對應機器碼中的一行或者多行。

程式(簡單的理解,執行的一個程式)在執行前會被分配一片記憶體空間,用於儲存程式碼、資料和臨時變數。

如果 url::analyse($_SERVER) 在引入檔案之前被執行,CPU 會線上程的記憶體空間中索引對應的類,而載入的動作在後面,顯然是索引不到的,這樣就會丟擲一個錯誤。

這就是前面所說的,工具必須在使用之前就準備好,執行邏輯和載入檔案之間具有同步(可以理解為具有先後順序要求)關係。


框架功能執行

具體指

<?php
// 解析陣列拿到路徑
url::analyse($_SERVER);

$obj = new url();
// 載入指定檔案
include(APP.$obj->get('path').EXT);

$class_name = $obj->get('controller');
$func = $obj->get('func');

這一段處理了這麼幾個問題:

  • 解析請求,拿到目標路由
  • 載入目標檔案
  • 獲取控制器,方法名

應用功能執行

具體指

<?php
$app = new $class_name();
$app->$func();

這是業務執行的核心,雖然所有的請求利用的是同樣的邏輯,但是通過模組,控制器和方法名引數的變化,就可以實現不同業務邏輯的載入,進而實現不同的業務。

PS:本系列文章最佳閱讀方式,IDE+本地執行環境,IDE中閱讀可配合 demo 執行增進理解,GitHub地址

城裡的野山參

相關文章