tp5和tp3.2的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41846563/article/details/81234036

万变不离其宗,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', 'onestopweb@163.com'); 
    //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代码
展开阅读全文

没有更多推荐了,返回首页