完虐ThinkPHP 5.* 遠不止這些


 

目錄
下載安裝
規范整理
結構介紹
簡單配置
簡單數據顯示
數據庫配置
數據庫基本使用
模型基本使用
總結:(ThinkPhp5.+<-->ThinkPhp3.+)
下載安裝
一、官網下載安裝
獲取ThinkPHP的方式很多,官方網站( http://thinkphp.cn )提供了穩定版本或者帶擴展完整版本的下載。
官網的下載版本不一定是最新版本,GIT版本獲取的才是保持更新的版本。
二、Composer安裝
ThinkPHP5支持使用Composer安裝,如果還沒有安裝 Composer,你可以按 Composer安裝 中的方法安裝。在 Linux 和 Mac OS X 中可以運行如下命令:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
在 Windows 中,你需要下載並運行 Composer-Setup.exe。
然后在命令行下面,切換到你的web根目錄下面並執行下面的命令:
composer create-project topthink/think tp5 --prefer-dist
composer更新方式:composer self-update
三、Git安裝
如果你不太了解Composer或者覺得Composer太慢,也可以使用git版本庫安裝和更新,ThinkPHP5.0拆分為多個倉庫,主要包括:
應用項目:https://github.com/top-think/think
核心框架:https://github.com/top-think/framework

之所以設計為應用和核心倉庫分離,是為了支持Composer單獨更新核心框架。
首先克隆下載應用項目倉庫
git clone https://github.com/top-think/think tp5
然后切換到tp5目錄下面,再克隆核心框架倉庫:
git clone https://github.com/top-think/framework thinkphp
兩個倉庫克隆完成后,就完成了ThinkPHP5.0的Git方式下載,如果需要更新核心框架的時候,只需要切換到thinkphp核心目錄下面,然后執行:
git pull https://github.com/top-think/framework
如果不熟悉git命令行,可以使用任何一個GIT客戶端進行操作,在此不再詳細說明。
無論你采用什么方式獲取的ThinkPHP框架,現在只需要做最后一步來驗證是否正常運行。
在瀏覽器中輸入地址:
http://localhost/tp5/public/
如果瀏覽器輸出如圖所示,那么說明你成功了,如果不是,那么請檢測相關配置或者步驟:

規范整理
ThinkPHP5遵循PSR-2命名規范和PSR-4自動加載規范,並且注意如下規范:
目錄和文件
目錄不強制規范,駝峰及小寫+下划線模式均支持;
類庫、函數文件統一以.php為后綴;
類的文件名均以命名空間定義,並且命名空間的路徑和類庫文件所在路徑一致;
類文件采用駝峰法命名(首字母大寫),其它文件采用小寫+下划線命名;
類名和類文件名保持一致,統一采用駝峰法命名(首字母大寫);
函數和類、屬性命名
類的命名采用駝峰法(首字母大寫),例如 User、UserType,默認不需要添加后綴,例如UserController應該直接命名為User;
函數的命名使用小寫字母和下划線(小寫字母開頭)的方式,例如 get_client_ip;
方法的命名使用駝峰法(首字母小寫),例如 getUserName;
屬性的命名使用駝峰法(首字母小寫),例如 tableName、instance;
以雙下划線“__”打頭的函數或方法作為魔法方法,例如 __call 和 __autoload;
常量和配置
常量以大寫字母和下划線命名,例如 APP_PATH和 THINK_PATH;
配置參數以小寫字母和下划線命名,例如 url_route_on 和url_convert;
數據表和字段
數據表和字段采用小寫加下划線方式命名,並注意字段名不要以下划線開頭,例如 think_user 表和 user_name字段,不建議使用駝峰和中文作為數據表字段命名。
應用類庫命名空間規范
應用類庫的根命名空間統一為app(可以設置app_namespace配置參數更改)
例如:app\index\controller\Index和app\index\model\User。
結構介紹
下載最新版框架后,解壓縮到web目錄下面,可以看到初始的目錄結構如下:

5.0的部署建議是public目錄作為web目錄訪問內容,其它都是web目錄之外,當然,你必須要修改public/index.php中的相關路徑。如果沒法做到這點,請記得設置目錄的訪問權限或者添加目錄列表的保護文件。
router.php用於php自帶webserver支持,可用於快速測試
啟動命令:php -S localhost:8888 router.php
5.0版本自帶了一個完整的應用目錄結構和默認的應用入口文件,開發人員可以在這個基礎之上靈活調整。
上面的目錄結構和名稱是可以改變的,尤其是應用的目錄結構,這取決於你的入口文件和配置參數。
這里是我下載解壓后的目錄結構

簡單配置
細心的話我們可以發現,ThinkPhp5中入口文件相對ThinkPhp3中的入口文件發生了變化,在ThinkPhp5中的入口文件是放在根目錄中的public里面index.php文件,其實5相對3來說,變化還是挺大的,如果之前是使用3寫的項目。要升級到5的話,估計也是一個大工程,需要很細心的處理。
前面我們輸入了: http://localhost/tp5/public/
查看public中可以看到index.php的內容和ThinkPhp3中的入口有點相似:
ThinkPhp3的入口文件
// 應用入口文件

// 檢測PHP環境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');

// 開啟調試模式 建議開發階段開啟 部署階段注釋或者設為false
define('APP_DEBUG',True);

// 定義應用目錄
define('APP_NAME','App');
// 定義應用目錄
define('APP_PATH','./App/');

// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

// 親^_^ 后面不需要任何代碼了 就是如此簡單
ThinkPhp5的入口文件
// [ 應用入口文件 ]

// 定義應用目錄
define('APP_PATH', __DIR__ . '/../application/');
// 加載框架引導文件
require __DIR__ . '/../thinkphp/start.php';
所以我們會發現入口文件指向的是Application文件夾,然后進入到Application文件夾,有個index文件夾,里面有個Controller文件夾,打開index.php文件,看到:
<?php
namespace app\index\controller;

class Index
{
public function index()
{
return '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一劍 - 為API開發設計的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛雲</a> 獨家贊助發布 ]</span></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>';
}
}
其中return返回的數據,正好是我們前面輸入: http://localhost/tp5/public/%E6%89%80%E7%9C%8B%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84%E6%95%B0%E6%8D%AE%E3%80%82
下面開始簡單的項目文件配置(根據個人習慣而定)。
文件創建
一切先從Application文件夾開始。因為我們平時一個項目中都會分前后端,所以這里在Application中新建一些文件個文件夾,至於index文件夾可以不用管,也可以在他的基礎上或者直接把他當做前段文件夾。
home文件夾
common.php文件
config.php文件
controller文件夾
index.php文件
view文件夾
index文件夾
index.html文件
model文件夾
admin文件夾
common.php文件
config.php文件
controller文件夾
index.php文件
view文件夾
index文件夾
index.html文件
model文件夾
app_extend文件夾
common.php文件
config.php文件
controller文件夾
miaosha文件夾
weixin文件夾
tuangou文件夾
view文件夾
miaosha文件夾
weixin文件夾
tuangou文件夾
model文件夾
miaosha文件夾
weixin文件夾
tuangou文件夾
common文件夾
關於其他配置和相關文件的介紹這里就略過了。相信有一點基礎一應都能看懂。
數據簡單顯示
在admin和home中controller文件夾對應的index.php文件中寫下面代碼:
index.php實現
<?php namespace app\home\controller; use think\Controller; class Index extends Controller { public function index() { return $this->fetch(); } }
fetch()和ThinkPhp3中的display()方法的功能一應,實現MV層的傳遞。
fetch 渲染模板輸出
display 渲染內容輸出
assign 模板變量賦值
engine 初始化模板引擎
在admin和home中view文件夾對應的index.html文件中寫下面代碼:
index.html實現
<html>

<head>
<meta charset = "utf-8">
</head>

<body>

歡迎來到iCocos=name;;;;;;;;;;;

</body>

</html>
至於視圖的實例化和相關配置,使用和渲染請查看官方手冊: 視圖
使用:瀏覽器分別輸入下面的路徑,可以看到對應我們想要看到的界面
home:
http://127.0.0.1/ThComp3/public/home/index
admin:
http://127.0.0.1/ThComp3/public/admin/index
這里就簡單的實現了MVC中M層和V層之間的處理。
數據庫配置
先使用Navicat或者phpMyAdmin創建對應的數據庫和表,並且初始化一些字段,然后插入一條簡單的數據,這里我使用Navicat(支持多數數據庫,操作簡單)。

配置數據庫相關屬性
在根目錄的database.php中配置對應的數據信息


配置數據庫相關屬性

在根目錄的database.php中配置對應的數據信息

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

return [
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'WWWiCocos',
// 用戶名
'username' => 'root',
// 密碼
'password' => '',
// 端口
'hostport' => '3306',
// 連接dsn
'dsn' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => '',
// 數據庫調試模式
'debug' => true,
// 數據庫部署方式:0 集中式(單一服務器),1 分布式(主從服務器)
'deploy' => 0,
// 數據庫讀寫是否分離 主從式有效
'rw_separate' => false,
// 讀寫分離后 主服務器數量
'master_num' => 1,
// 指定從服務器序號
'slave_no' => '',
// 是否嚴格檢查字段是否存在
'fields_strict' => true,
// 數據集返回類型 array 數組 collection Collection對象
'resultset_type' => 'array',
// 是否自動寫入時間戳字段
'auto_timestamp' => false,
// 是否需要進行SQL性能分析
'sql_explain' => false,
];
也可以在調用Db類的時候動態定義連接信息
Db::connect([
// 數據庫類型
'type' => 'mysql',
// 數據庫連接DSN配置
'dsn' => '',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'thinkphp',
// 數據庫用戶名
'username' => 'root',
// 數據庫密碼
'password' => '',
// 數據庫連接端口
'hostport' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => 'think_',
]);
或者使用字符串方式:
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');
基本使用
配置了數據庫連接信息后,我們就可以直接使用數據庫運行原生SQL操作了,支持query(查詢操作)和execute(寫入操作)方法,並且支持參數綁定。
Db::query('select * from think_user where id=?',[8]); Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
也支持命名占位符綁定,例如:
Db::query('select * from think_user where id=:id',['id'=>8]); Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);
可以使用多個數據庫連接,使用
Db::connect($config)->query('select * from think_user where id=:id',['id'=>8]);
config是一個單獨的數據庫配置,支持數組和字符串,也可以是一個數據庫連接的配置參數名。
CRUD
查詢: 基本查詢
查詢一個數據使用:
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id',1)->find();
find 方法查詢結果不存在,返回 null
查詢數據集使用:
Db::table('think_user')->where('status',1)->select();

select 方法查詢結果不存在,返回空數組
如果設置了數據表前綴參數的話,可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
增加:添加一條數據
使用 Db 類的 insert 方法向數據庫提交數據
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
如果你在database.php配置文件中配置了數據庫前綴(prefix),那么可以直接使用 Db 類的 name 方法提交數據
Db::name('user')->insert($data);
insert 方法添加數據成功返回添加成功的條數,insert 正常情況返回 1
添加數據后如果需要返回新增數據的自增主鍵,可以使用getLastInsID方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();
或者直接使用insertGetId方法新增數據並返回主鍵值:
Db::name('user')->insertGetId($data);
insertGetId 方法添加數據成功返回添加數據的自增主鍵
更新:更新數據表中的數據
Db::table('think_user') ->where('id', 1) ->update(['name' => 'thinkphp']);
如果數據中包含主鍵,可以直接使用:
Db::table('think_user')
->update(['name' => 'thinkphp','id'=>1]);
update 方法返回影響數據的條數,沒修改任何數據返回 0
如果要更新的數據需要使用SQL函數或者其它字段,可以使用下面的方式:
Db::table('think_user') ->where('id', 1) ->update([
'login_time' => ['exp','now()'],
'login_times' => ['exp','login_times+1'],
]);
更新某個字段的值:
Db::table('think_user') ->where('id',1) ->setField('name', 'thinkphp');
setField 方法返回影響數據的條數,沒修改任何數據字段返回 0
刪除: 刪除數據表中的數據
// 根據主鍵刪除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);

// 條件刪除
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();
delete 方法返回影響數據的條數,沒有刪除返回 0
助手函數
// 根據主鍵刪除
db('user')->delete(1);
// 條件刪除
db('user')->where('id',1)->delete();
查詢:條件查詢方法
where方法
可以使用where方法進行AND條件查詢:
Db::table('think_user') ->where('name','like','%thinkphp') ->where('status',1) ->find();
多字段相同條件的AND查詢可以簡化為如下方式:
Db::table('think_user') ->where('name&title','like','%thinkphp') ->find();
whereOr方法
使用whereOr方法進行OR查詢:
Db::table('think_user') ->where('name','like','%thinkphp') ->whereOr('title','like','%thinkphp') ->find();
多字段相同條件的OR查詢可以簡化為如下方式:
Db::table('think_user') ->where('name|title','like','%thinkphp') ->find();
其他高級操作參考官方手冊: 數據庫操作
模型介紹
模型類定義
如果在某個模型類里面定義了connection屬性的話,則該模型操作的時候會自動連接給定的數據庫連接,而不是配置文件中設置的默認連接信息,通常用於某些數據表位於當前數據庫連接之外的其它數據庫,例如:
//在模型里單獨設置數據庫連接信息
namespace app\index\model;

use think\Model;

class User extends Model {
protected $connection = [
// 數據庫類型
'type' => 'mysql',
// 數據庫連接DSN配置
'dsn' => '',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'thinkphp',
// 數據庫用戶名
'username' => 'root',
// 數據庫密碼
'password' => '',
// 數據庫連接端口
'hostport' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => 'think_',
];
}
也可以采用DSN字符串方式定義,例如:
//在模型里單獨設置數據庫連接信息
namespace app\index\model;

use think\Model;

class User extends Model
{
//或者使用字符串定義
protected $connection = 'mysql://root:1234@127.0.0.1:3306/thinkphp#utf8';
}
和連接數據庫的參數一樣,connection屬性的值也可以設置為數據庫的配置參數。
5.0不支持單獨設置當前模型的數據表前綴。
模型調用
模型類可以使用靜態調用或者實例化調用兩種方式,例如:
// 靜態調用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();

// 實例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();

// 使用 Loader 類實例化(單例)
$user = Loader::model('User');

// 或者使用助手函數`model`
$user = model('User');
$user->name= 'thinkphp';
$user->save();
模型初始化
模型同樣支持初始化,與控制器的初始化不同的是,模型的初始化是重寫Model的initialize,具體如下
namespace app\index\model;

use think\Model;

class Index extends Model
{

//自定義初始化
protected function initialize()
{
//需要調用`Model`的`initialize`方法
parent::initialize();
//TODO:自定義的初始化
}
}
同樣也可以使用靜態init方法,需要注意的是init只在第一次實例化的時候執行,並且方法內需要注意靜態調用的規范,具體如下:
namespace app\index\model;

use think\Model;

class Index extends Model
{

//自定義初始化
protected static function init()
{
//TODO:自定義的初始化
}
}
CRUD
增加
添加一條數據
第一種是實例化模型對象后賦值並保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
也可以使用data方法批量賦值:
$user = new User;
$user->data([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
或者直接在實例化的時候傳入數據
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
如果需要過濾非數據表字段的數據,可以使用:
$user = new User($_POST);
// 過濾post數組中的非數據表字段數據
$user->allowField(true)->save();
如果你通過外部提交賦值給模型,並且希望指定某些字段寫入,可以使用:
$user = new User($_POST);
// post數組中只有name和email字段會寫入
$user->allowField(['name','email'])->save();

save方法新增數據返回的是寫入的記錄數。
更新
查找並更新
在取出數據后,更改字段內容后更新數據。
$user = User::get(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
直接更新數據
也可以直接帶更新條件來更新數據
$user = new User;
// save方法第二個參數為更新條件
$user->save([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
],['id' => 1]);
上面兩種方式更新數據,如果需要過濾非數據表字段的數據,可以使用:
$user = new User();
// 過濾post數組中的非數據表字段數據
$user->allowField(true)->save($_POST,['id' => 1]);
如果你通過外部提交賦值給模型,並且希望指定某些字段寫入,可以使用:
$user = new User();】(['name','email'])->save($_POST, ['id' => 1]);
刪除
刪除當前模型
刪除模型數據,可以在實例化后調用delete方法。
$user = User::get(1);
$user->delete();
根據主鍵刪除
或者直接調用靜態方法
User::destroy(1);
// 支持批量刪除多個數據
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
條件刪除
使用數組進行條件刪除,例如:
// 刪除狀態為0的數據
User::destroy(['status' => 0]);
還支持使用閉包刪除,例如:
User::destroy(function($query){
$query->where('id','>',10);
});
或者通過數據庫類的查詢條件刪除
User::where('id','>',10)->delete();
查詢
獲取單個數據
獲取單個數據的方法包括:
取出主鍵為1的數據
$user = User::get(1);
echo $user->name;

// 使用數組查詢
$user = User::get(['name' => 'thinkphp']);

// 使用閉包查詢
$user = User::get(function($query){
$query->where('name', 'thinkphp');
});
echo $user->name;
或者在實例化模型后調用查詢方法
$user = new User();
// 查詢單個數據
$user->where('name', 'thinkphp')
->find();
get或者find方法返回的是當前模型的對象實例,可以使用模型的方法。
其他高級操作參考官方手冊: 模型操作
入門總結
ThinkPHP5. 與 ThinkPHP3. 之間的使用差異
因為研究TP5時間不是很長,暫時先列以下幾處差異:
1、過去的單字母函數已完全被替換掉,如下:
S=>cache,C=>config,M/D=>model,U=>url,I=>input,E=>exception,L=>lang,A=>controller,R=>action
2、模版渲染:$this->display() => return view()/return $this->fetch();
3、在model中調用自身model:$this => Db::table($this->table)
4、在新建控制器與模型時的命名:
  ①控制器去掉后綴controller:UserController => User

  ②模型去掉后綴model:UserModel => User
5、url訪問:
  如果控制器名使用駝峰法,訪問時需要將各字母之間用下划線鏈接后進行訪問。

  eg:控制器名為AddUser,訪問是用add_user來進行訪問
6、在TP5中支持配置二級參數(即二維數組),配置文件中,二級配置參數讀取:
  ①Config::get('user.type');

  ②config('user.type');
7、模板中支持三元運算符的運算:{$info.status ? $info.msg : $info.error}還支持這種寫法:
{$varname.aa ?? 'xxx'}或{$varname.aa ?: 'xxx'}
8、TP5內置標簽:
  系統內置的標簽中,volist、switch、if、elseif、else、foreach、compare(包括所有的比較標簽)、(not)present、(not)empty、(not)defined等
9、TP5數據驗證:
  $validate = new Validate(['name' => 'require|max:25','email' => 'email']);

  $data = ['name' => 'thinkphp','email' => 'thinkphp@qq.com'];

  if(!validate->check($data)){

    debug::dump($validate->getError());

  }
注:使用助手函數實例化驗證器——$validate = validate(‘User’);
10、TP5實現了內置分頁,使用如下:
查詢狀態為1的用戶數據,且每頁顯示10條數據
  $list = model('User')->where('status',1)->paginate(10);

   $page = $this->render();

   $this->assign('_list',$list);

   $this->assign('_page',$page);

   return $this->fetch();
模板文件中分頁輸出代碼如下:
  <div>{$_page}</div>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM