怎麼樣寫一個自己的渣渣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。
-
require 的key值就是你需要告訴composer你的專案需要哪些包,value是對應包的版本號。比如我上面的,專案需要 php 並且版本應該大於等於 5.7 ,需要 “filp/whoops” 當前的最高版本(*號表示沒有版本限制,預設當前最高版本),“hassankhan/config” 的 0.10.0 版本。目前就需要這些,這些包都是可以通過 Packagist.org 搜尋獲取。(這些包的作用後續告訴大家)。
-
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 嗎!
寫的好累呀,看個電影 放鬆一下也不足為奇吶。