[toc]
出發點:我個人理解 自己開發框架也是鍛煉原生的一種手段。寫完之后看別的框架也方便多了。如果你遇到一個沒有文檔或文檔極少的框架,可以跟著這個思路摸索著補充。或干脆拿著原生上來就是干,我剛接觸yii2的時候就是這樣,都沒來的及看文檔就開工了,基本純原生寫的,就用了個yii2的csrf和雙語言...
>[info]源碼下載地址:https://github.com/yxgg/-frame
## :-: **寫框架的 極簡思路**
接收,打印參數想怎么弄。如 獲取配置文件的方法,根據傳過來的參數 構想
1、一般都是先判斷文件是否存在。存在就該include就include,該new就new。然后存到對象的屬性中(做緩存)
2、主要是調用流程:都什么需要放到run方法中
## :-: **詳細思路**

### :-: **1、寫入口文件**
- 第2步-第5步都是寫在入口文件中的
### :-: **2、定義常量**
- 就是框架的各層級目錄,省著每次寫一大串
```
//定義框架根目錄
//定義核心文件目錄路徑
//應用目錄(包含控制器、模型等)
//是否開啟調試
//如果DEBUG為true,將錯誤
```
### :-: **3、引入函數庫**
```
//加載公共方法
//加載核心文件
```
### :-: **4、自動加載**
~~~
判斷要加載的類是否存在。提示:要加載的類已經存到屬性中了,其實拿這個屬性判斷。
存在返回true;
不存在就加載。提示:加載時反斜線替換
要加載的是文件,就include。注意:這個文件從根目錄下找
要加載的不是文件,就返回false
~~~
>[warning]注意:寫完再建立lib目錄,引入路由類。測試
### :-: **5、啟動框架**
```
//調用核心文件中的run方法(我的核心文件是core/init.php)
```
### :-: **6、路由解析三部曲(分3個步驟)**
6.1、隱藏入口文件
6.2、獲取url的參數
~~~
存在,就解析
正常情況,先轉數組(方便處理),效驗非正常情況(如:只在url上輸入了控制器,沒有輸入方法,給方法個默認值)
處里url上的多余參數
正常情況
非正常情況,他輸入的是奇數
非正常情況下,返回錯誤,寫入日志 等
不存在給默認值。如 跳轉到首頁
~~~
6.3、返回對應的控制器和方法(其實在6.2中存到屬性中,也算是返回了)
### :-: **7、加載控制器**
- 在run()時就要加載控制器
- 將路由解析出來的控制器名,拼成控制器文件的路徑。
- 判斷控制器文件是否存在,存在就new。不存在就拋出錯誤
>[info]這里引入了模塊的概念\\app是模塊不是應用,比成熟的框架少一層
### :-: **8、返回結果**
- 跑起來試一試,其實到這步一個建檔的框架已經完成了。接下來的是擴展框架
### :-: **9、在控制器中連接模型類**
- 在lib中建立個model類,用于連接數據庫
- 在控制器中new model類,寫sql操作數據庫
### :-: **10、中寫視圖類**
- assign和display方法寫在初始化(core/init.php)類中。
>[info]先賦值,后包含模板文件
- 然后控制器繼承該類,進行調用。
### :-: **11、寫配置類**
新建配置文件類
寫單個配置文件的方法(提示:既然他倆獲取,傳參是少不了的。2個參數,配置項,配置文件名。打印參數,然后構想)
//1、判斷配置文件是否存在,存在就include
//2、判斷配置項是否存在,存在直接給緩存到屬性中
//3、判斷屬性中有無緩存,有就直接返回屬性中存的
寫獲取所有配置文件的方法
>[info]新建個配置文件目錄,用來放各種配置文件(如 數據庫的,路由的,日志的....)
測試:配置文件好使不
### :-: **12、寫日志類**
- 提示:用的是工廠模式的思想:
- 讀取配置文件,獲取當前驅動。在初始化方法中new類
- 在log方法中,調用不同驅動中的log方法
```
//建立日志類
//建立驅動目錄
//建立日志的配置文件
```
### :-: **13、使用composer**
>[info]在自己的框架上,編寫json文件,這樣放到github上之后,別人就可以通過name名“xgkj”來使用composer下載了。

- 第1個"報錯"類庫的下載地址:https://github.com/filp/whoops
- 第2個“酷炫打印變量”類庫的下載地址:
```
"symfony/var-dumper":"*" #更帥氣變量輸出的效果
"ymfony/var-umper":"*" #更帥氣變量輸出的效果
```
- 第3個“數據庫”類庫的下載地址:http://medoo.lvtao.net/1.2/doc.php
- 第4個“模板引擎”類庫的下載地址:https://twig.symfony.com/doc/2.x/intro.html#installation

鏡像網址:[https://pkg.phpcomposer.com/](https://pkg.phpcomposer.com/)


注意:下圖很重要


### :-: **14、使用medoo數據庫類**
- 如果自己封裝pdo可能會有什么想象不到的漏洞,這樣我們就不如直接用現成的類庫加載
http://medoo.lvtao.net/
```
//先將原來繼承的pdo換成該類庫
//在封裝模型控制器調用
```
### :-: **15、模板引擎類庫**
```
//修改display方法,改成類庫的,還有模板布局
```
### :-: **16、其余擴展**
- 剩下其余的擴展就因人而異了,想不到的話,可能去參考成熟的框架
- 這里寫2個封裝好的方法
- 封裝post接收方法(給大家做參考思路)


- 封裝跳轉方法

- 雜談
- 開發 & 維護的工作流程
- 新手如何看php手冊 和 框架手冊
- 開發 & 維護的不同點
- 從0到1,搭建新項目的工作流程
- 從1到N,維護的工作流程
- 優化流程
- 生成錯誤日志和慢日志的方法
- 查錯思路
- 怎么快速接手一個項目
- 前端常用知識點
- javascript
- 自己封裝的函數
- 處理數字
- 功能代碼
- 動態添加圖片
- 判斷是手機端還是pc端
- javascript:;是什么意思?怎么用呢
- html & h5
- a標簽中target設置為blank和_blank有什么區別?
- 亂碼
- 提交方式:button標簽 和 input
- 塊元素
- 內聯元素
- h5特有屬性
- h5的localStorage【增、刪、改、查】
- jquery
- 常用方法
- 功能代碼
- 動態刪除圖片
- 一個按鈕,切換2種狀態
- 換膚
- 深入理解(function(){... })();
- json & xml
- json
- 語法速記
- json對象取值
- 字符串、對象、數組的區別
- xml
- [CDATA[%s]]的作用是什么
- 轉義字符
- CDATA 想被xml解析的文本數據
- CDATA 不想被xml解析的文本數據
- 微信小程序
- 其他
- websocket
- 跨域
- css
- 行內 & 內連 & 外連 寫法
- 優先級
- 更加精準的匹配
- 使用百分比如何生效
- php在html、js、jq中的的原生寫法
- *php在html中的語法
- php在js中的語法
- php在jq中的語法
- 正則表達式
- php常用基礎知識(思想為主)
- php為什么是“邊編譯邊運行”
- 冒號、endif、endwhile、endfor使用
- 遞歸思想(速記法)
- cookie和session的理解
- php常用內置(系統)函數
- 常量
- 字符串
- 數組
- 日期時間
- 文件 & 目錄
- 數學
- 程序執行
- 判斷
- 選項和信息(修改配置文件的)
- 錯誤處理 & 日志記錄
- 編碼格式
- session
- IP相關
- 類 & 對象
- 性能
- 其他函數
- 魔術方法
- $_SERVER
- 變量處理
- php自己封裝的一些函數
- 導入、導出、生成文件
- 數組
- 數字
- 字符串
- 其他
- 獲取linux硬件信息
- 常見插件/類庫使用
- 前端-框架/插件
- bootstrap 學習筆記
- layer 學習筆記
- layDate 學習筆記
- 百度ueditor1.4.4.3富文本編輯器
- quill富文本編輯器
- 百度ECharts圖形報表
- webuploader上傳圖片
- 后端類庫
- workerman 聊天室
- QRCODE 二維碼
- redis
- seaslog 日志
- phpspider 爬蟲
- Mailer 發送郵件
- simple_html_dom
- phpstorm使用
- 快捷鍵
- 連接mysql數據庫
- 斷點 + debug調試
- 運行內存不夠
- wamp環境
- yii、laravel、tp、開發自己的php框架
- 看框架源碼的思路
- tp5框架的使用
- 1、助手函數原理解析
- 開發自己的php框架
- 常用的開發思路 和 小功能實現代碼
- 爬蟲思路
- 功能點思路
- tp5判斷是不是異地登錄(簡單版)
- 微信開發,反向代理
- 微信開發,關閉當前頁面
- 消息隊列的實現
- 頁面靜態化
- session串號
- 站內信設計思路
- web在線管理器
- 語言相關(開發有關)
- 接收json(text/xml)格式數據
- 原生文件上傳(狀態碼)
- openssl擴展
- 打印對象 和 遍歷對象
- 使用OB緩存的幾個原則
- CLI模式執行php文件
- foreach時,添加元素 或 修改元素的值
- 功能點 代碼實現
- 生成url目錄樹(沒有pid)
- 多圖上傳(vue傳base64)
- 下載文件,耗時算法
- 生成商品二維碼
- 導出excel
- 搜索
- 阿里大魚發短信
- 使用阿里云oss
- location.href跳轉后,丟失用戶的session
- “\r ” “\r\n” “\t”的區別
- php的配置文件詳解
- 開啟錯誤日志
- 開啟慢日志
- 開啟短標簽
- 分析php-fpm.conf中的request_terminate_timeout參數