1. 程式人生 > >tp5和tp3.2的區別

tp5和tp3.2的區別

萬變不離其宗,tp5和tp3.2雖說是差別很大,但是套路大家都懂得。只要我們瞭解了他們的區別,再去學tp5,豈不是如魚得水。

好,那我們來了解一下tp5和tp3.2的區別。

1,入口檔案的繫結

我們都知道thinkphp是一個單入口框架,它所有的請求都通過public/index.php進入,如果我們正常情況下,我們預設訪問的是index模組下的Index控制器下的index方法,如果我們現在想訪問index.php或者是我們在這個地方再新建一個其它的檔案,我們能不能將這個檔案,直接繫結到某個模組?

我們在入口檔案(public/index.php)中新增如下程式碼(注意順序一定是這樣的),他就會通過index.php,自動訪問home模組

// 定義應用目錄
define('APP_PATH', __DIR__ . '/../application/');
// 繫結到index模組
define('BIND_MODULE','home');
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';

如果我的網站開發給第三方,那麼我肯定不期望第三方訪問我的index模組和admin模組,這樣我們只需要在index.php入口檔案的同級建一個api.php,然後在api.php中繫結api模組,這樣我們訪問public/api.php直接訪問api模組,別的模組訪問不了。

此外,在thinkphp/convention.php中有一個 ‘auto_bind_module’,我們把它改成true,開啟了入口檔案自動繫結,也可以實現同樣的操作

2.URL和路由的變化

thinkphp/convention.php找到url_route_on和url_route_must,是配置路由是否開啟和是否強制使用路由。

我們使用預設配置,然後找到public/route.php檔案

return [
    'test/:id'      => 'index/test'
];

配置好路由,就可以通過指定路由訪問。

3.請求物件Request和響應物件Response

5.0新增了請求物件Request和響應物件Response,Request統一處理請求和獲取請求資訊,Response物件負責輸出客戶端或者瀏覽器響應。

tp5中我們有三種方法可以讓我們獲得Request物件

1,框架提供的一個助手函式request()

2,是通過think下的Request類來獲取它的例項

3,直接注入Request物件

具體獲取引數方法如下:

<?php 
namespace api\index\controller; 
use think\Request; 
class Index 
{ 
  public function index(Request $request) 
  { 
    # 獲取瀏覽器輸入框的值 
    dump($request->domain()); 
    dump($request->pathinfo()); 
    dump($request->path()); 
      
    # 請求型別 
    dump($request->method()); 
    dump($request->isGet()); 
    dump($request->isPost()); 
    dump($request->isAjax()); 
      
    # 請求的引數 
    dump($request->get()); 
    dump($request->param()); 
    dump($request->post()); 
    //session('name', 'onestopweb'); 
    //cookie('email', '[email protected]'); 
    //session(null); 
    //cookie('email',null); 
    dump($request->session()); 
    dump($request->cookie()); 
      
    dump($request->param('type')); 
    dump($request->cookie('email')); 
      
    # 獲取模組 控制器 操作 
    dump($request->module()); 
    dump($request->controller()); 
    dump($request->action()); 
      
    # 獲取URL 
    dump($request->url()); 
    dump($request->baseUrl()); 
  } 
} 

4,資料庫操作

tp5.0助手函式廢除了單字母函式,改用助手函式

M->db

呼叫資料表:

M('User')->where(['name'=>'thinkphp'])->find();(3.2)

db('User')->where('name'=>'thinkphp')->find();(5.0)

D->model

例項化模型的使用:

D('User')->where(['name'=>'thinkphp'])->find();

model('User')->where(['name'=>'thinkphp'])->find();

//或者
$UserModel =new User();

$UserModel->where(['name'=>'thinkphp'])->find();

U->url

IS_Get->Request::instance()->isGet();

IS_POST->Request::instance()->isPost();

I->input(代替)

5,在控制器中正確的輸出模板

如果你繼承think\Controller的話,可以使用:

return $this->fetch('index/hello');

如果你的控制器沒有繼承 think\Controller的話,使用:

return view('index/hello');

6.常量

5.0版本廢棄了原來的大部分常量定義,僅僅保留了框架的路徑常量定義,其餘的常量可以使用App類或者Request類的相關屬性或者方法來完成,或者自己重新定義需要的常量。
廢除的常量包括:
REQUEST_METHOD、IS_GET IS_POST、IS_PUT、IS_DELETE、IS_AJAX __EXT__、COMMON_MODULE 、MODULE_NAME、CONTROLLER_NAME、ACTION_NAME、APP_NAMESPACE、APP_DEBUG、MODULE_PATH

當然一些常用的常量可以自己定義,如定義路徑常量

在application/config.php,或者在模組下新建一個config.php。

return [
	'view_replace_str' =>[
		'__HOME__' => '/static/home',
	]
];

我們還是可以方便的引入和替換一些css,js 檔案

7.模板繼承

模板繼承是一項更加靈活的模板佈局方式,模板繼承不同於模板佈局,甚至來說,應該在模板佈局的上層。模板繼承其實並不難理解,就好比類的繼承一樣,模板也可以定義一個基礎模板(或者是佈局),並且其中定義相關的區塊(block),然後繼承(extend)該基礎模板的子模板中就可以對基礎模板中定義的區塊進行過載。

因此,模板繼承的優勢其實是設計基礎模板中的區塊(block)和子模板中替換這些區塊。

每個區塊由{block} {/block}標籤組成。 下面就是基礎模板中的一個典型的區塊設計(用於設計網站標題):

{block name="title"}<title>網站標題</title>{/block}

block標籤必須指定name屬性來標識當前區塊的名稱,這個標識在當前模板中應該是唯一的,block標籤中可以包含任何模板內容,包括其他標籤和變數,例如:

{block name="title"}<title>{$web_title}</title>{/block}

你甚至還可以在區塊中載入外部檔案:

{block name="include"}{include file="Public:header" /}{/block}

一個模板中可以定義任意多個名稱標識不重複的區塊,例如下面定義了一個base.html基礎模板:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}標題{/block}</title>
</head>
<body>
{block name="menu"}選單{/block}
{block name="left"}左邊分欄{/block}
{block name="main"}主內容{/block}
{block name="right"}右邊分欄{/block}
{block name="footer"}底部{/block}
</body>
</html>

然後我們在子模板(其實是當前操作的入口模板)中使用繼承:

{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
 {$vo.content}
{/volist}
{/block}
{block name="right"}
 最新資訊:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
 @ThinkPHP 版權所有
{/block}

上例中,我們可以看到在子模板中使用了extend標籤來繼承了base模板

8,標籤

tp5.0標籤預設使用{ },3.2是< >,變數輸出使用普通標籤就足夠了,但是要完成其他的控制、迴圈和判斷功能,就需要藉助模板引擎的標籤庫功能了,系統內建標籤庫的所有標籤無需引入標籤庫即可直接使用。

內建標籤包括:

標籤名 作用 包含屬性
include 包含外部模板檔案(閉合) file
load 匯入資原始檔(閉合 包括js css import別名) file,href,type,value,basepath
volist 迴圈陣列資料輸出 name,id,offset,length,key,mod
foreach 陣列或物件遍歷輸出 name,item,key
for For迴圈資料輸出 name,from,to,before,step
switch 分支判斷輸出 name
case 分支判斷輸出(必須和switch配套使用) value,break
default 預設情況輸出(閉合 必須和switch配套使用)
compare 比較輸出(包括eq neq lt gt egt elt heq nheq等別名) name,value,type
range 範圍判斷輸出(包括in notin between notbetween別名) name,value,type
present 判斷是否賦值 name
notpresent 判斷是否尚未賦值 name
empty 判斷資料是否為空 name
notempty 判斷資料是否不為空 name
defined 判斷常量是否定義 name
notdefined 判斷常量是否未定義 name
define 常量定義(閉合) name,value
assign 變數賦值(閉合) name,value
if 條件判斷輸出 condition
elseif 條件判斷輸出(閉合 必須和if標籤配套使用) condition
else 條件不成立輸出(閉合 可用於其他標籤)
php 使用php程式碼