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