ThinkPHP5.1入門
===================================
Composer的官方網站:
https://www.phpcomposer.com/
=======================================
Composer的簡介:
Composer是PHP用來管理依賴關系的工具。
可以在自己的項目中聲明所依賴的外部工具庫,
Composer會幫你安裝這些依賴的庫文件。
=====================================
Composer安裝中國全局鏡像可以大幅提升國內訪問速度。
修改 composer 的全局配置文件:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
===========================================
composer官網有個【安裝包列表】,可以找到要下載的安裝包。
https://packagist.org/。
然后搜索thinkphp的安裝包,輸入:topthink。
找到第一個就是,下載命令:
composer create-project topthink/think 項目名稱。
=======================================
thinkphp5的入口訪問文件是public下的index.php
==============================================
tp5的基本運行流程:
瀏覽器-->入口文件index.php-->啟動腳本start.php-->基礎配置base.php
-->自動加載Loader.php-->接收請求Request.php-->返回響應Response.php。
=================================================
tp5.1的配置
相比tp5.0:
1、用config目錄取代了config.php文件;
2、一級配置名稱就是配置文件的的名稱;
3、路由配置route.php完全獨立出來了;
4、模塊配置與應用配置完全獨立不再合並。
=====================================================
tp5的模塊名字、控制器的目錄名字都是小寫;
控制器名字首字母大寫,相比tp3.2,命名不需要.class。
tp5的命名空間需要把寫三級,即app\模塊名字\controller;
tp3.2的命名空間寫兩級,即模塊名字\Controller。
===============================================
獲取config的配置項:
配置文件在thinkphp\library\think\Config.php。
而thinkphp\library\think\facade\Config.php把配置項都轉成了
靜態方式訪問。
在控制器中獲取配置項:
use think\facade\Config;
//獲取所有配置項
dump(Config::get());//獲取所有配置項
//獲取一級配置項
dump(Config::get('app.'));//獲取app文件里的配置項
dump(Config::get('database.'));//獲取database文件里的配置項
或者
dump(Config::pull('database');
獲取二級配置項(app是默認的一級配置項前綴,可以省略,其他不可以):
dump(Config::get('database.type'));//獲取database文件里的配置項數據庫類型。
查詢配置項是否存在:
dump(Config::has('database.type'));
動態設置配置文件
Config::set('app_debug',true);
================================================
使用助手函數Config(),不依賴Config類,
即不需要使用use think\facade\Config。
//獲取所有配置項
dump(config());
//獲取一級配置項
dump(config('database.'));
//獲取二級配置項
dump(config('database.type'));
//判斷配置項是否存在,使用問號
dump(config('?database.type'));
設置配置項
config('database.hostname','localhost');
===================================================
Trait介紹:
自PHP5.4起,PHP實現了一種代碼復用的方法,稱為trait。
Trait是為類似PHP的單繼承語言二准備的一種代碼復用機制。
Trait為了減少單繼承語言的限制,使開發人員能夠自由地在不同
層次結構內獨立的類中復用method。
=======================================================
trait實現了代碼的復用,突破了單繼承的限制;
trait是類,但是不能實例化。
示例:
trait Demo1{
public function hello1(){
return __METHOD__;
}
}
trait Demo2{
public function hello2(){
return __METHOD__;
}
}
class Demo{
use Demo1,Demo2;//繼承Demo1和Demo2
public function hello(){
return __METHOD__;
}
public function test1(){
//調用Demo1的方法
return $this->hello1();
}
public function test2(){
//調用Demo2的方法
return $this->hello2();
}
}
$cls = new Demo();
echo $cls->hello();
echo $cls->test1();
echo $cls->test2();
優先級問題:
當當前類和父類、trait類的方法重名后,
當前類>trait>父類。
當多個trait類重名后,就會報錯,需要額外處理:
use Demo1,Demo2{
//Demo1的hello替換Demo2的hello方法
Demo1::hello insteadof Demo2;
//Demo2的hello起別名
Demo2::hello as Demo2Hello;
}
================================================
容器(注冊樹)和依賴注入
容器用來更方便地管理類依賴即運行依賴注入。
容器用來進行類管理,還可以將類的實例(對象)作為參數,
傳遞給類方法,自動觸發依賴注入;
依賴注入:將對象類型的數據,以參數的方式傳遞到方法的參數列表。
public function getMethod(\app\home\Index $index){
}
參數\app\home\Index $index相當於$index=new \app\home\Index;
會觸發依賴注入。
依賴注入是實例化對象參數的技術。
====================================================
容器:
把一個類放到容器中:
\think\Container::set('temp','\app\home\Index');
//使用助手函數bind('temp','\app\home\Index');
$temp = \think\Container::get(abstract:'temp',['param1'=>'123']);
//或者使用助手函數app('temp',['param1'=>'123']);
return $temp->getName();
把一個閉包Closure放到容器(閉包可以理解為匿名函數)
\think\Container::set('temp',function($domain){
return 'PHP'.$domain;
});
return \think\Container::get('temp',['domain'=>'123']);
=========================================================
Facede門面,門面為容器中的類提供了一個靜態調用的接口,相比於傳統
的靜態方法調用,帶來了更好的可測試性和擴展性,可為任何的非靜態類庫
定義一個facade類。
想要靜態方式訪問一個動態方法,就需要給當前類綁定一個靜態代理的類。
靜態代理類就是think\facade.php。
class Test extends \think\Facade{
protected static function getFacadeClass(){
return 'think\Myself';//要代理的類
}
}
動態綁定:
\think\Facade::bind('app\home\Test','think\Myself');
===============================================================
tp5正常情況下,控制器不依賴父類Controller.php;
推薦繼承父類,可以很方便的使用在父類中封裝好的方法和屬性;
Controller.php沒有靜態代理;
控制器的輸出,字符串用return;復雜類型用dump();
==============================================================
Request請求:
方法一(直接實例化Request類):
$request = new \think\Request();
dump($request->get());
方法二(使用facade靜態代理):
$request = new \think\facade\Request();
dump($request::get());//這樣可以靜態調用動態方法
方法三(依賴注入Request $request):
use think\Request;
public function test(Request $reques){
dump($request->get());
}
方法四(繼承Controller類):
class Test extends \think\Controller{
public function demo(){
dump($this->request->get());
}
}
===============================================================
連接數據庫:
方法一(使用全局配置config/database.php):
Db::table('user')->where('id',1)->value('name');
方法二(動態鏈接數據庫):
Db::connect([
'type'=>'msyql',
'hostname'=>'localhost',
'database'=>'demo',
'username'=>'root',
'password'=>'123456',
])->table('user')->where('id',1)->value('name');
方法三(DSN連接):
$dsn = 'mysql://root:123456@localhost:3306/demo#utf8';
Db::connect($dsn)->table('user')->where('id',1)->value('name');
==============================================================
config目錄下的配置文件:
如果要指定一個模塊的配置文件,可以在config目錄下,創建一個和模塊
名字相同的目錄,在目錄下寫一個配置文件,
示例:
默認config目錄下有個database.php的全局數據庫配置文件,
如果在config目錄下新建一個index\database.php,這個數據庫配置文件
就只對index模塊有效。
=============================================================
數據庫操作:
find(),單條查詢,查詢不到返回null;
findOrEmpty(),單條查詢,查詢不到返回空數組;
field(),指定返回的字段;
table(),選擇數據表;
select(),返回多條數據;
where(),查詢條件,示例where([['course','=','php'],['grade','>=',80]]);
value(),返回個字段,單個值。
column(),返回某一列的值。
column('name','id'),返回name列的值,並以id為索引。
insert(),添加一條數據;
Db::table('user')->data($add_data)->insert();
返回新增id:
Db::table('user')->data($add_data)->insertGetId();
insertAll(),插入多條數據。
update(),更新操作,必須有where條件。
delete(),刪除操作。
原生sql,使用query()查詢和execute()更新添加刪除;
$sql = "select id,name from user";
Db::query($sql);
======================================================================
模型是和數據表綁定的,
use app\index\model\User;
User::get(1);//獲取id為1的數據。
User::field('id,name')->where('id',9)->find();
User::all();//獲取多條記錄
=================================================================
模板賦值與變量輸出
$content='PHP CSS';
return $this->display($content);
使用view();
return $this->view->display($content);//$this->view是controller的方法。
或者
use think\facade\View;
return View::display($content);
//使用視圖將數據進行輸出fetch():
$this->view->assign('name','zhang san');//賦值
$this->view->assign(['name'=>'zhang san','age'=>2]);//批量賦值
return $this->view()->fetch();
模板中使用傳遞的變量:
{$name}
{//這是注釋}
{$order.id}
{$order['id']}
==========================================
創建對象
$obj = new \stdClass();
$obj->id = 1;
$obj->name = 'PHP';
$this->view->assign('info',$obj);//批量賦值
return $this->view()->fetch();
模板中使用:
{$info->id}
=================================
模板中使用常量:
{$Think.const.SITE_NAME}
{$Think.const.PHP_VERSION}
模板中使用系統變量:
{$Think.server.php_self}
{$Think.server.session.id}
{$Think.server.get.id}
模板中獲取配置:
{$Think.config.database.hostname}
獲取請求變量
{$Request.get.name}
{$Request.path}
{$Request.root} //值為/index.php
{$Request.root.true} //值為http://localhost/index.php
==================================================================
laravel中的take相當於limit();
==================================================================