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