php框架
一、真實項目開發步驟:
- 多人同時開發項目,協作開發項目、分工合理、效率有提高(代碼風格不一樣、分工不好)
- 測試階段
- 上線運行
- 對項目進行維護、修改、升級(單個人維護項目,十分困難,代碼風格不一樣)
- 項目穩定的運行階段
- 項目停止運行(舊項目的人員已經全部離職,新人開發新項目)
二、問題:
1. 多人開發項目,分工不合理,(html php mysql)
2. 代碼風格不一樣,后期維護十分困難
3. 項目生命周期十分短,項目生命沒有延續性,造成資源浪費、人員浪費
4. 項目不能很好適應客戶需求,牽一發而動全身。
三、其他相關框架
1. zendframework zend php語言公司發布的官方框架,重量級(功能多)
2. yii 美國華人開發的框架,xue qiang, qiang, 重量級框架,純OOP框架
3. CI CodeIgniter輕量級框架,開發速度快,部署靈活
- cakephp外國框架,重量級,速度慢
- symfony外國重量級框架
- ThinkPHP輕量級框架,國人框架,入門容易
四、什么框架:
一堆代碼的集合,里邊有變量、函數、類、常量,里邊也有許多設計模式MVC、AR數據庫、單例等等。
框架可以節省我們50-60%的工作量,我們全部精力都集中在業務層次。
五、為什么使用框架
(1)框架可以幫組我們快速、穩定、高效搭建程序系統
(2)該系統由於框架的使用使得本身的維護性、靈活性、適應客戶需求方面得到最大化的增強。
(3)使用框架的過程中可以使得我們的注意力全部集中業務層面,而無需關心程序的底層架構。
【使用框架】
thinkphp.cn
thinkphp 3.2版本
【框架項目部署】
部署一個Shop項目,使用tp框架
步驟:
創建入口文件:
1.在ThinkPHP目錄下創建一個入口文件index.php
2.訪問入口文件的同時系統會自動把對應的應用目錄文件Shop創建出來
3.打開Home文件夾
【MVC模式】
M:Model 數據模型層,負責數據操作
V:View 視圖層,負責顯示視圖
C:Controller 控制器,實現業務邏輯
【控制器訪問及路由解析】
通過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地址模式設置(配置文件ThinkPHP/Conf/convertion.php)
URL_MODEL = 0/1/2/3 分別代表四種url地址模式
config.php是我們當前自己項目的配置文件,我們可以通過修改該文件達到配置變量的目錄
這個文件在系統運行過程中會覆蓋convertion.php的配置變量
include “convertion.php”;
include “config.php”; 后引入的文件要把先引入的文件配置變量給覆蓋掉
我們系統有兼容4中url地址模式的使用
系統有的時候會自動創建url地址,它會根據當前模式進行url地址創建使用
快捷函數U(); 創建url地址
通過url地址模式我們學習到了以下內容:
- 我們學習到了配置變量(核心配置變量conversion.php、當前應用配置變量config.php)
- 快捷函數U(“模塊/控制器/方法”) 根據參數和url模式創建對應的url地址
- 把框架的模式調整為開發調試模式
【開發、生產模式】
開發調試模式:系統需要加載大概24個文件 index.php define(“APP_DEBUG”,true);
生產模式:系統只需要加載很少的大概7個文件在入口文件
index.php中定義: define(“APP_DEBUG”,false);
節省了許多文件的開發、關閉的系統開銷,節省資源
要在頁面顯示trace信息,需要在自己的配置文件中:
【控制器和對應方法創建】
控制器是MVC模式中的核心,tp默認有一個Index控制器:
Index控制器里面有一個操作方法:Index
我們在訪問http://localhost:8080/Thinkphp/index.php入口文件的時候,會默認訪問Index控制器下面的Index方法
如果要自己創建一個控制器Login:
1.在\Shop\Home\Controller文件夾下新建一個控制器文件LoginController.class.php
注意:文件命名規則,按照駝峰法命名
2.打開該文件,在里面造控制器Login類
3.如果要自定義操作方法,在控制器Login類里面加一個函數Login():
這樣我們就完成了控制器和操作方法的建立,如果要訪問我們剛才的Login控制器下的Login方法:
4.控制器中如果要調用視圖層中的模板:
這樣再次訪問,會發現報錯:
原因:模板文件沒有創建,這時候我們就要去創建模板文件
【視圖模板文件創建】
視圖模板文件存放發位置在:
里面沒有模板文件
如果我們想要訪問Login控制器中的Login方法,首先我們要創建一個Login控制器對應的模板文件夾,該文件夾就對應着Login控制器:
然后在Login文件夾下再創建一個login.html的模板文件來對應Login控制器下的Login方法:
在login.html里面寫入要顯示的代碼:
然后再次請求:
【url地址大小寫設置】
默認是不敏感的:
在config.php里邊對url大小寫敏感進行設置
【空操作和空控制器處理】
空操作:就沒有指定的操作方法
空控制器:沒有指定控制器
http://網址/index.php/Home/User/login
http://網址/index.php/Home/User/hello空操作
http://網址/index.php/Home/beijing/login 空控制器
空操作:
一般網站處於安全考慮不給用戶提示任何錯誤信息
“空操作”本質意思:一個對象(控制器)調用本身不存在的方法
在OOP里邊,對象調用本身不存在方法,處於用戶體驗比較好的角度考慮,我們可以在類里邊制作一個魔術方法:function __call();
在tp里面控制器的父類:
父類中有個方法:
所以空操作有兩種解決方案:
① 在對應的控制器里邊制作一個方法,名稱為”_empty”,這個控制器的空操作都會自動執行該方法。(推薦使用)
② 給空操作的名稱制作一個同名的模板出來,系統會自動調用
空控制器:
空控制器:在實例化控制器對象的時候,沒有找到指定的類
什么時候實例化控制器對象:ThinkPHP/Library/Think/App.class.php
熟記文件:
index.php 入口文件
ThinkPHP/ThinkPHP.php 框架核心文件
ThinkPHP/Library/Think/Think.class.php 框架核心文件
ThinkPHP/Library/Think/App.class.php 框架應用文件
在App.class.php內部包括控制器對象創建,以及對象調用指定的方法呈現內容:
空控制器處理方案:可以再制作一個控制器,名稱EmptyController.class.php
在該控制器內部其實只需要制作一個_empty()方法即可。
這樣再次請求:
【項目分組】
系統有前台用戶操作界面
系統還有后台供公司內部人員使用維護平台
兩者在使用的過程中就是對“控制器”、“視圖模板”、“model模型”的操作。
為了系統開發方便,及代碼部署更加合理,我們的控制器、view視圖等前后台文件不要混在起,要在物理結構上給分開
http://網址/index.php/Home/控制器/操作方法訪問Home控制器及制定操作
http://網址/index.php/Admin/控制器/操作方法訪問Admin分組的控制器和操作方法
【系統常量信息】
獲取系統常量信息:
如果加參數true,會分組顯示:
【跨控制器調用】
一個控制器在執行的時候,可以實例化另外一個控制,並通過對象訪問其指定方法。
跨控制器調用可以節省我們代碼的工作量
在Main控制器中有一個Info操作方法
想要在其它控制器,比如Login中調用,我們可以實例化控制器對象,調用里面的方法即可:
造對象有快捷函數供我們使用:
A(“[模塊/]控制器標志”) 實例化控制器對象
R([模塊/]控制器標志/操作方法) 實例化對象同時調用指定方法
【連接數據庫配置及Model數據模型層】
convertion.php
config.php
1.在config.php做數據庫連接配置
2.制作model模型
a) model本身就是一個類文件
b) 數據庫中的每個數據表都對應一個model模型文件
c) 最簡單的數據model模型類
3.字段緩存設置
tp框架執行過程中會使用到數據表中的字段信息,通過sql語句可以查詢”show colums from table”,處於性能考慮,可以把字段緩存,避免每次重復執行sql語句。
4.可以根據情況對當前的model模型進行個性化設置
實例化Model的三種方式:
- $goods = new 命名空間GoodsModel();
- $goods = D(‘模型標志’);
a) $goods = D(“Goods”);
b) 該$goods是父類Model的對象,但是操作的數據表還是sw_goods
c) $obj = D(); 實例化Model對象,沒有具體操作數據表,與M()方法效果一致
- $obj = M();
a) 實例化父類Model
b) 可以直接調用父類Model里邊的屬性,獲得數據庫相關操作
c) 自定義model就是一個空殼,沒有必要實例化自定義model
d) $obj = M(‘數據表標志’); 實例化Model對象,實際操作具體的數據表
$obj = D(標志);
$obj = D();
$obj = M(標志);
$obj = M();
D()和M()方法的區別:
前者是tp3.1.3里邊對new操作的簡化方法;
后者在使用就是實例化Model父類
兩者都在函數庫文件定義ThinkPHP/Common/functions.php
注意:如果沒有對應的model模型文件類,也可以直接實例化model對象進行操作
D()和M()方法都可以實例化操作一個沒有具體model模型類文件的數據表。
【數據查詢】
select()是數據模型的一個指定方法,可以獲得數據表的數據信息
返回一個二維數組信息,當前數據表的全部數據信息
$obj = D(); 創建對象
$obj -> select(); 查詢數據
select 字段,字段 from 表名 where 條件 group 字段 having 條件 order 排序 limit 限制條數;
SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%
$obj ->field(字段,字段); 查詢指定字段
$obj ->table(數據表); 設置具體操作數據表
$obj ->where(參數); 參數就是正常sql語句where后邊的條件信息
例如:( “goods_price >100 and goods_name like ‘三%’”)
$obj ->group(字段); 根據字段進行分組查詢
$obj ->having(參數條件); having 條件設置
$obj ->order(‘price desc/asc’) 排序查詢
$obj ->limit([偏移量,]條數) 限制查詢的條數
sql語句里邊具體的條件設置在tp框架model模型里邊體現為具體的方法操作
以上方法理論上是父類Model的對應方法
父類model具體存在方法:field() where() limit()
還有一些方法在__call()自動調用函數里邊: table() group() order() having()
在__call()魔術方法里邊會判斷當前的執行方法是否是一個method屬性的元素信息,如果存在就會執行執行。
以上多個方法是同時使用多個進行條件顯示(並且沒有順序要求)
$obj -> limit(5)->field(‘id,name’)->order(‘price asc’) -> table(‘sw_goods’)->select();
以上許多方法執行沒有順序要求,許多方法執行后都是把具體的參數賦予到model屬性options里邊,最后根據options拼裝sql語句。
$info = $goods -> where()->field(字段)->select();
select()方法
1. 返回一個二維數組信息
2. 返回全部數據表信息
3. 給該方法傳遞參數
a) select(30) 查詢主鍵值等於30的記錄信息
b) select(“10,12,14”) 查詢主鍵值在10、12、14范圍的記錄信息
4.find()如果我們查詢的結果只有一個信息,使用select()會返回一個二維數組
為了使用方便我們會希望返回一個一維數組,這時候可使用find()方法
5.having()方法設置查詢條件,where()設置查詢條件
6. 相關聚合函數 count() sum() avg() max() min()
以上聚合函數是最后被調用的方法
以上方法可以結合具體條件方法使用
例如:$goods -> where(‘goods_price >1000’)->count(); 大於1000元的商品的總數目
【數據添加】
add()該方法返回被添加的新記錄的主鍵id值
兩種方式實現數據添加
1.數組方式數據添加
$goods = D(“Goods”);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是數據表中字段名稱
$goods -> add($arr);
2.AR方式實現數據添加
a) ActiveRecord 活躍記錄
b) AR規定了程序與數據庫之間的關系
c) 什么是AR:
d) ①一個數據表對應一個類model
e) ②一條數據記錄對應類的一個對象
f) ③每個字段對應該對象的具體屬性
g) tp框架的AR是假的
$goods = D(“Goods”);
$goods -> goods_name = “htc_one”;
$goods -> goods_price = 3000;
$goods -> add();
以上兩種方式:數組、AR,最后add都要把新記錄的主鍵id值返回
【收集表單數據入庫操作】
- 制作一個表單
- 通過$_POST收集信息
- 通過create()方法實現數據收集,該方法對於非法的字段會自動進行過濾
注意:一個add控制器實現兩個邏輯,一個是打出添加頁面,一個是向數據庫添加內容
注意:如果是主鍵值重復,這種錯誤會導致error()方法不跳轉頁面直接拋出錯誤信息,這是新版本問題,如果想要跳轉,找到
【數據修改操作】
save() 實現數據修改,返回受影響的記錄條數
具體有兩種方式實現數據修改,與添加類似(數組、AR方式)
1.數組方式
a) $goods = D(“Goods”);
b) $ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手機’,’goods_price’=>1200);
c) $goods ->where(‘goods_id>50’)-> save($ar);
2.AR方式
a) $goods = D(“Goods”);
b) $goods -> goods_id = 53;
c) $goods -> goods_name = “三星手機”;
d) $goods -> goods_price = 2000;
e) $goods ->where(‘goods_price>10000’)->save();
以上兩種方式如果可行,即要修改全部數據
以上sql語句從技術上可行,從業務上不可行(事故)
tp框架有智能考慮,以上情況的sql語句不被允許執行。
如何執行:
① 明確告訴系統那條sql語句被update更新
② 可以設置where進行sql語句更新操作
save() 方法返回值
0:之前沒有問題,執行前后數據沒有變化
自然數:受影響的記錄條數
false:執行失敗
數據修改具體實現:
通過路由給一個操作方法傳遞參數
http://網址/index.php/模塊/控制器/方法upd/變量名1/值/變量名2/值/變量名3/值
以上路由是通過get形式給指定的操作傳遞了三個參數信息
$_POST方式也可以
原則三個參數信息接收的時候通過$_GET接收即可
例如:$_GET[‘變量名1’];
以上參數信息接收太直白,不安全,需要按照框架規則使用下邊的方式接收get參數信息
http://網址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing
function upd($name,$age,$addr){
$name;
$age;
$addr;
}
以上參數表述,如果在請求的時候沒有按照規則傳遞參數,那么當前方法禁止訪問。
(除非參數有默認值)
修改商品信息步驟:
- 在“修改”按鈕處把被修改商品id信息通過get形式傳遞給upd操作
- 在upd方法里邊制作形式參數$goods_id,接收服務器給傳遞的get變量goods_id
- 在修改表單里邊制作隱藏域goods_id,避免tp框架禁止修改語句執行
- 在upd操作方法內部有兩個邏輯:展現表單、收集表單
【數據刪除及執行原生sql語句】
delete()返回受影響的記錄條數
$goods -> delete(30); 刪除主鍵值等於30的記錄信息
$goods -> delete(“10,12,13”); 刪除主鍵值等於10 12 13的三條記錄
$goods -> where(“goods_id>60”)->delete() 把符合條件的記錄都給刪除
執行原生sql語句
- 查詢語句query() 返回一個二維數組信息
- 添加、修改、刪除 execute() 返回受影響的記錄條數
$goods = D(“Goods”);
$sql = “select * from sw_goods”;
$rst = $goods ->query($sql);
$sql = “select goods_category_id,avg(goods_price) from sw_goods group by goods_category_id having avg(goods_price)>1000”;
$goods ->query($sql);
$sql = “update sw_goods set goods_name = ‘htc_two’ where goods_id=100”;
$goods ->execute($sql);
【表單驗證】
javascript
jquery
在服務器端通過tp框架實現表單驗證
用戶名、密碼、重復密碼、郵箱、qq、手機號碼、愛好、學歷
具體步驟:
- 制作表單
- 表單form數據通過create()方法收集(驗證功能要求我們必須通過create()方法收集數據)
- 自定義數據model模型類實現具體驗證規則
【tp框架驗證碼支持使用】
ThinkPHP/Library/Think/Verify.class.php
$verify = new 命名空間Verify();
$verify -> entry(); 生成一個驗證碼
一個單獨的方法生成驗證碼
在模板使用:
驗證是否成功:
【Session和Cookie】
tp框架關於session操作(cookie)
//session(name,value, 有效時間) 設置session
//session(name) 獲取session
//session(name,null) 刪除指定session
//session(null) 清空全部session
【tp框架實現數據分頁】
1.我們第三方類庫放的位置:
當前模塊(Home)目錄下,模塊中的類庫命名空間的根都是以模塊名命名
ThinkPHP/Library/目錄下,根命名空間為ThinkPHP/Library
2.
在ThinkPHP/Library/Think/
下面有很多類庫供我們使用
3.類的命名規則:要有命名空間,類文件名 Page.class.php
4.在控制器中實例化分頁類使用:
模板頁面:
【tp框架擴展函數庫】
三個位置:
- ThinkPHP/Common/functions.php
- 應用/Common/Common/function.php
- 模塊/Common/function.php
在該文件里面寫自定義方法即可
【tp框架文件上傳中文亂碼問題】
在windows操作系統下:
在ThinkPHP/Library/Think/Upload/Driver/Local.class.php
第83行將$filename 改為iconv('utf-8','gb2312',$filename)