1. 程式人生 > >怎麼樣寫一個自己的渣渣PHP框架(1)

怎麼樣寫一個自己的渣渣PHP框架(1)

專案地址
最近有時間,於是就想寫一個框架吧!這樣可以更好的瞭解整個框架是怎麼執行的,可以更好的理解MVC模式 面向物件模式等。寫的比較菜了。就當學習。哈哈哈!
進入正題:

實我還是建議初學者(特指已經學完PHP基礎語法,並且瞭解一些開源框架MVC,再加上composer的童鞋們)寫一個自己的框架。練練手!

php 有個composer包,這可是個好東西。裡面什麼都有。就像nodejs的npm包管理,就像python裡的pip,還像什麼語言裡的什麼什麼,我就不得而知了,因為別的我比較不會…

我們先來搞明白一個簡單小框架的執行流程,index.php -> 定義基礎常量 -> 引入配置檔案 -> 自動載入(重點)-> 路由解析(重點)-> MVC 大概類似的就是這樣一個流程,然後加上composer,或者你需要的各種類庫,一個輕量級,基礎級的框架就誕生了,你可以取個簡單響亮的名字。

開始的話你肯定要搭建php環境了。php的話要7.0以上。
先從index.php入口檔案來寫吧

新建一個目錄,比如 /gzyCFM ,然後新建一個index.php檔案,ok 入口檔案建好了,簡直是好的開始就是成功的一半啊。

  • Composer 中文文件。【Composer 中文文件 | Composer 中文網】
  • Packagist 是主要的 composer 儲存庫。它集合了可以使用Composer安裝的公共PHP包。【Packagist The PHP Package Repository】

然後新建一個composer.json (如果不瞭解composer的童鞋可以看 ↑ 先去自行了解)

{
  "name": "php/gzyCFM",
  "description": "php/gzycmf The PHP Framework",
  "version": "1.0.0-beta",
  "keywords": ["php","php framework"],
  "require": {
    "php": ">=7.0",
    "filp/whoops":"*",
    "hassankhan/config":"0.10.0"
  },
  "repositories": {
    "packagist": {
      "type": "composer",
      "url": "https://packagist.phpcomposer.com"
    }
  }
}

composer.josn的其他引數大家自己瞭解一下,這裡我只說require和repositories。

  1. require 的key值就是你需要告訴composer你的專案需要哪些包,value是對應包的版本號。比如我上面的,專案需要 php 並且版本應該大於等於 5.7 ,需要 “filp/whoops” 當前的最高版本(*號表示沒有版本限制,預設當前最高版本),“hassankhan/config” 的 0.10.0 版本。目前就需要這些,這些包都是可以通過 Packagist.org 搜尋獲取。(這些包的作用後續告訴大家)。

  2. repositories 我看過一篇帖子,說這樣寫的話,貌似是換成國內的源,更新下載包的時候速度會比較快一些。

然後 命令列模式去目錄下執行 composer install 目錄中會多出一個 vendor 目錄和 composer.lock 檔案,composer安裝(停頓一下)包有兩種方法,我每次在require增加新的包,就直接執行 composer update 就OK了。雖然我可能說的比較混亂,但是這不是今天的重點,你先去google、百度,回頭再說composer。嗯,就這麼愉快的決定了。

之後要關鍵的index.php自動載入

// Autoload 自動載入
require 'vendor/autoload.php';

我剛才composer包中下載

  • “filp/whoops”:"*",

官網連結:“filp/whoops” 裡詳細介紹,並且有運用方法。雖然是英文但是你可以用翻譯呀。大概就是,這個包是一個PHP錯誤處理的包。幫你再除錯web程式的時候,描述程式碼執行過程,準確定位錯誤的原因及程式碼的位置。

在index.php檔案裡寫

$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

然後我們故意製造一個錯誤:(用9除以0)

echo 9/0;

訪問一下你的 index.php 看看是不是

在這裡插入圖片描述

  • “hassankhan/config”
    官網連結:"hassankhan/config"裡有詳細介紹,是一款輕量級配置檔案載入器,支援PHP,INI,XML,JSON和YAML檔案。

我們怎麼用的呢!

在根目錄先新建一個 config 目錄,/gzyCFM/config 下新建 conf.php (或者conf.josn 不是說過了,"hassankhan/config"支援php,josn等等檔案)

在conf.php裡寫:(conf.json直接寫json就可以了)

return [
	"debug"		 => true,  // 是否開啟除錯模式
	"url_route"  => 'PATH_INFO', //PATH_INFO 普通模式
	'modules'	 => 'home',
	'controller' => 'Index',    // 預設控制器
    'action' 	 => 'run',          // 預設方法
	"template"   =>[
		'template'      => 'php',//模板預設原生php
		'suffix'        => '.php', //設定模板檔案的綴 如果是smarty就是 .html
		'templateaDir'  => 'views/',//設定模板所在的資料夾
		'compiledir'    => 'runtime/HTML',//設定編譯後存放放的目錄
		'suffix_cache'  =>  '.php',//設定編譯檔案字尾
	]
];


回到index.php,定義專案根目錄常量 YIN_PATH,

define("YIN_PATH",dirname(__FILE__));
define("WEB_URL","http://".$_SERVER['SERVER_NAME'].":".$_SERVER["SERVER_PORT"]."/");//域名
//echo $_SERVER['SERVER_NAME']; exit;
// Config

//echo YIN_PATH. '/data/gzycmf/config/conf.php';exit;


require 'vendor/autoload.php';
$conf = new \Noodlehaus\Config(YIN_PATH. '/config/conf.php');
echo $conf->get('debug');


訪問你的index.php有沒有輸出 1 不就是你的 debug的值 true 嗎!

寫的好累呀,看個電影 放鬆一下也不足為奇吶。