ThinkPHP
一、什么框架:
一堆代碼的集合,里邊有變量、函數、類、常量,里邊也有許多設計模式MVC、AR數據庫、單例等等。
框架可以節省我們50-60%的工作量,我們全部精力都集中在業務層次。
二、PHP開發存在的問題:
1. 多人開發項目,分工不合理,(html php mysql)
2. 代碼風格不一樣,后期維護十分困難
3. 項目生命周期十分短,項目生命沒有延續性,造成資源浪費、人員浪費
4. 項目不能很好適應客戶需求,牽一發而動全身。
三、為什么使用框架
框架可以幫組我們快速、穩定、高效搭建程序系統
該系統由於框架的使用使得本身的維護性、靈活性、適應客戶需求方面得到最大化的增強。
使用框架的過程中可以使得我們的注意力全部集中業務層面,而無需關心程序的底層架構。
四、相關框架
1. zendframework zend php語言公司發布的官方框架,重量級(功能多)
2. yii 美國華人開發的框架,xue qiang, qiang, 重量級框架,純OOP框架
3. CI CodeIgniter 輕量級框架,開發速度快,部署靈活
4.cakephp 外國框架,重量級,速度慢
5.symfony 外國重量級框架
6.ThinkPHP 輕量級框架,國人框架,入門容易
【使用框架】
現在已經更新到5.0版本 不過我們現在學習的是3.2版本
Think PHP 3.2 版本 下載下來 解壓之后
【MVC模式】
M:Model 數據模型層,負責數據操作 例如 之前寫的 DBDA類 就相當於一個數據模型層 和數據庫進行一些相關操作
V:View 視圖層,負責顯示視圖 相當於模板
C:Controller 控制器,實現業務邏輯 業務邏輯層 核心
如果你的程序使用了MVC 模式 有一句話一定要記住 “約定勝於配置!!!”
如果使用了MVC 模式 里面有很多約定 非強制性 但是一定要遵循這些約定 不然會出問題 只有遵循這些約定 才不用去修改一些單獨的配置 所以盡量按照約定來寫
舉一個約定的例子:
約定里面有一個駝峰法 針對文件的命名
比如類文件 在MVC 模式里面必須用駝峰法寫 : RenMin 首字母大寫 類文件后面必須加.class.php 也就是類文件命名必須這樣寫 RenMin.class.php
還有類文件class前面的名字必須跟類名一樣 你寫了一個RenMin 的 類 文件的命名也必須是 RenMin ,也就是類文件命名必須這樣寫 RenMin.class.php
文件夾的命名也是一種約定 不能隨意改換。必須是這樣
【框架項目部署】
創建入口文件:
- 在ThinkPHP目錄下創建一個入口文件index.php
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- // 應用入口文件 // 檢測PHP環境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 開啟調試模式 建議開發階段開啟 部署階段注釋或者設為 false 生產模式 define('APP_DEBUG',True);//開發調試模式
// 定義應用目錄 define('APP_PATH','./Shop/');//更改shop訪問入口文件 系統會自動創建對應的應用目錄文件 // 引入ThinkPHP入口文件 核心操作 require './ThinkPHP/ThinkPHP.php'; // 親^_^ 后面不需要任何代碼了 就是如此簡單
2、訪問入口文件的同時系統會自動把對應的應用目錄文件創建出來
3、打開Home文件夾
如圖所示 上圖 也有配置文件 Conf 這是Home文件夾里的配置文件 有些程序需要修改配置文件 要修改自帶的 Conf 不要動 TP框架里的Conf 一旦動了 用這個框架的所有程序都會出現改變 切記切記!
如果你不想使用Home模塊 可以自定義一個其他名字的模塊 比如:Admin
但是 如果想讓Admin像Home般 正常使用,就要在Admin下建好相應的文件夾 文件夾名字必須是這樣 不能隨意更換。
然后需要在controller文件夾里面寫控制器,控制器文件的命名必須使用駝峰法再加上控制器,比如我新建了一個名字叫login 的控制器,名字必須是 LoginController.class.php
控制器內的寫法為:
<?php //命名空間 相當於虛擬目錄 注意命名空間里面用的是反斜杠 Admin 模塊名 namespace Admin\Controller; use Think\Controller;//也是命名空間 use 繼承父類控制器 class LoginController extends Controller {//定義類 類名 extends 繼承 父類控制器 //寫操作方法 訪問時 訪問的是控制器里面的操作方法
public function index(){//操作方法 首字母小寫 但如果有第二個字母需要大寫 注意書寫規范 echo "這是Admin下的登錄控制器"; } }
訪問成功
一個控制器內有多個操作方法 一個操作方法對應一個模板文件 其他控制器中也可能出現這個操作方法對應這個模板文件 所以 在 View 文件夾下建模板文件是 需要先建一個對應控制器的文件夾 以免出錯 比如寫 LoginController.class.php控制器的模板文件 需要先在View 文件夾下 建一個Login文件夾,在Login文件夾下寫對應方法的模板文件 ,index方法 對應 index.html模板文件。
index.html模板文件內的寫法:
在LoginController.class.php控制器 index方法 里面調用: 或
訪問顯示:
注冊變量:
首先 在控制器里面 調用assign()方法,里面寫變量
在index.html里面調用test 首先需要知道 分隔符是什么 所以打開父類conf文件夾下的convention.php文件 找到
'TMPL_L_DELIM' => '{', // 模板引擎普通標簽開始標記
'TMPL_R_DELIM' => '}', // 模板引擎普通標簽結束標記
復制粘貼 拿到本模塊 conf文件夾下config.php文件內 也可以進行修改 我在這里修改成了
在index.html里面調用test
訪問
在index.PHP里面嵌入form表單:
<!-- <form action=" http://localhost/TP/index.php/Admin/Login/chuli" method="post"> --> <form action="__CONTROLLER__/chuli" method="post"> <!--表示找當前控制器下chuli操作方法--> <!--action 之前指向頁面 因為 現在是 MVC模式 它 應該指向控制器的操作方法 瀏覽器訪問頁面的地址
地址 太長 可以簡化一下 需要獲取一下系統常量--> <input type="submit" value="提交"/> <!--點擊提交轉入處理頁面--> </form> <!-- action 和 self 的區別 action:特指當前操作方法的路徑 self:指瀏覽器中有什么他就有什么 如果操作方法有get傳值 action只能取到操作方法 而 self 能全部取到包括操作方法后get傳的值 _APP_:程序目錄 _SELF_:代表自身 __MODULE_:代表模塊 例如:Home、Admin _CONTROLLER_:代表找到控制器 _ACTION_:找到操作方法 -->
點擊提交
轉到處理頁面
【控制器訪問及路由解析】
在瀏覽器中訪問操作方法 可以有一下四種方式
通過url地址get參數找到指定的控制器,並進行對應方法調用請求
http://網址/index.php?m=模塊名稱&c=控制器&a=方法
以上url地址信息代碼不夠優雅、不安全。
tp框架url地址可以由以下四種
- http://網址/index.php?m=XX&c=XX&a=XX 基本get模式
- http://網址/index.php/模塊/控制器/操作方法 路徑模式pathinfo 最常用
- http://網址/模塊/控制器/操作方法 rewrite重寫模式
- http://網址/index.php?s=/模塊/控制器/方法 兼容模式
這四種方式可以通過修改配置文件 來修改URL的模式
打開之前建的 Home文件夾 里面的的 Conf配置文件
打開config.php 文件 index.html文件沒什么用 可以直接刪掉
打開之后的樣子 可以在這里面寫配置
可是要寫什么配置呢?
我們可以找到TP 框架里的 conf文件夾 打開convention.php文件
找到URL_MODEL 復制 放到config.php 里面修改 不要動 convention.php里面的內容
將它復制到config.php里面修改,0為普通模式 也就是get模式 , 1為PATHINFO 模式 也就是 最常用的 路徑模式, 2 REWRITE 模式 也就是 重寫模式 3 兼容模式
默認為路徑模式模式。//無論這里修改成0 1 2 3 中的任意一個數組 在瀏覽器訪問時其他三種方式依然可以使用 此處修改 非是針對於訪問而是針對於生成。
如果想生成UL地址的話 可以使用U()方法 在IndexController.class.php里面作如下修改:
不做修改時默認為1,1生成的UL地址是:
接下來我們將1改成0 來看一下生成的UL地址:
將0改成2 生成的UL地址是:
將2改成3 生成的UL地址是:
生成UL地址的作用:跳轉頁面 生成一個地址跳轉 要用到UL地址時可以自動生成一個
U()里面寫index 生成的地址是當前模塊 當前控制器下index操作方法 在這里就是 Home模塊下 Index控制器下 index操作方法
如果要生成其他控制器比如Login控制器下的操作方法的地址 需要在U()方法里面 加上Login(控制器名) 然后/ 如下圖所示 生成的就是 Home模塊下 Login控制器下 index操作方法的UL地址
如果模塊也不一樣 就在控制器前再加模塊名和/ 如下圖:
參數不同 創建的訪問路徑也會不同。
快捷方法:
TP里面快捷方法比較多 U()方法是其中一個 用來創建UL地址 還有其他快捷方法 比如:
U() 制作url地址的快捷函數
C(名稱) 獲得配置變量(convertion.php config.php)信息
C(名稱,值) 設置配置變量信息
L() 獲得語言變量信息
E() 給頁面輸出錯誤信息
A("項目://模塊/控制器") 實例化控制器對象
A("Home/User") 實例化User控制器對象
A("book://Home/User") 實例化book項目的Home模塊的User控制器對象
R("Home(模塊)/Main(控制器)/mceshi(操作方法)"); 調方法
【url地址大小寫設置】
默認是不敏感的:
在config.php里邊對url大小寫敏感進行設置
顯示tract信息:
需要在配置(config.php)里面加上一句話('SHOW_PAGE_TRACE'=>true,),如圖所示:
再次訪問時,瀏覽器右下角會多一個圖標:
點開之后會:
顯示一些信息 在開發時 盡量打出來 便於查錯 開發完畢 可以關掉。
【空操作和空控制器處理】
空操作:就沒有指定的操作方法
空控制器:沒有指定控制器
前面提到過在網頁中訪問 最常用的是http://網址/index.php/模塊/控制器/操作方法 路徑模式 ,如果我們訪問了不存在的操作方法或者不小心打錯了字母 會出現
處於安全考慮 最好不要給用戶提示任何錯誤信息,如上圖所示 ,既降低了用戶體驗又增加了安全隱患,所以我們現在需要一個方法把這些都隱藏掉,在父類里面有一個__call (); 方法。
首先 上圖 第二條 檢查是否存在默認模版 如果有直接輸出模版,上面的非法操作一圖,我原本想要訪問的是chuli操作方法,可是我只打到了chu就進行了訪問,如果現在 在 view文件夾中有一個名字叫chu的模板的話就會直接輸出了,如下圖:
訪問chu
這樣就避免了信息的泄露,可是下次訪問我如果打成chul 還是顯示 非法操作的圖 ,想要用這種辦法完全杜絕是非常麻煩而又不現實的,所以我們再看第一條:如果定義了_empty操作 則調用,我們在控制器里定義一個_empty
在瀏覽器中隨意訪問不在的操作方法:
這樣就好了,我們再來看控制器:
訪問一個不存在的控制器:
與空操作一樣 在父類中有一個
里面有
所以 我們制作一個EmptyController.class.php控制器就好了
里面這樣寫
再次訪問:
在同一控制器下調用其他方法:
首先,我們在Login控制器下作兩個方法:
用$this->ceshi();調用 訪問caozuo();
【跨控制器調用】
一個控制器在執行的時候,可以實例化另外一個控制,並通過對象訪問其指定方法。
跨控制器調用可以節省我們代碼的工作量,比如有個操作方法需要重復使用,直接調用就可以,不用重復書寫。
在Main控制器中有一個mceshi()操作方法
在Login控制器中通過caozuo()方法來調用,有兩個方法
其一: echo不寫也可以
其二:通過快捷方法A()來調用
顯示:
【跨模塊調用】
首先在Home模塊Main控制器下寫操作方法
然后在Admin模塊Login控制器下調用 我們有以下三種方法
其一:造對象
其二:A()方法
其三:R()方法
A() 方法 和 R()方法 的區別:
A():造對象調用 可操作對象
R():直接調用方法,比較方便,不可操作
在瀏覽器中訪問
【命名空間】
相當於虛擬目錄
實現自動加載類的機制
初始命名空間:ThinkPHP\Library 相當於根 (最底層)
初始命名空間有很多根命名空間(相當於根路徑下有很多文件夾):
只有下面兩個地方可以存放類
1.Library里面的文件夾
2.APP(應用程序)的模塊文件夾 比如:Home,Admin
在定義的時候:在寫命名空間的時候需要從根寫起,寫到該文件所在的文件夾結束,
用的時候:use在寫命名空間的時候需要從根寫起,寫到該文件名(類名)結束
命名空間用\反斜杠
【模型層】
【連接數據庫配置及Model數據模型層】
convertion.php
config.php
- 在config.php做數據庫連接配置
未完待續。。。。。。。。。