PHP高手之路之ThinkPHP(2)

一、ThinkPHP中的视图(2)(重点)

1、模版内容获取方法

ThinkPHP中有一个方法和display方法有点点相似。这个方法叫做fetch方法:

Display方法:$this -> display(); 展示模版

Fetch方法:$this -> fetch(); 获取模版(有返回值)

 

ThinkPHP中系统封装好了一个友好的打印方法,这个方法是dump方法:

语法格式:dump(需要打印的变量);封装在系统的函数库文件functions.php

 

在底层实现上差异:

Display方法:替换模版中常量/变量  获取模版内容 → 输出模版内容

Fetch方法:替换模版中常量/变量  获取模版内容

Display方法的前2步的操作实际上是通过fetch方法来实现:

 

2、视图中的注释

视图中的注释特指是ThinkPHP中视图的注释。‘’

回顾一下html中的注释写法:<!注释内容-->

普通的html注释会在页面的源代码中会被输出:

 

 

ThinkPHP中的模版注释:

行注释:{//行注释内容}

块注释:{/*块注释内容*/}

 

 

显示效果:

 

 

经典面试题

问:ThinkPHP中的行注释和块注释与普通的html注释有什么区别?

答:普通的html注释属于客户端注释,会在浏览器的源代码中输出;而ThinkPHP中的模版注释则属于服务器端的注释,不会被浏览器输出。

 

注意点:

第一:行注释不要当作块注释来写(横跨多行);

第二:在行注释和块注释当中(大括号里面)不要再出现大括号(模版变量);

3、变量分配(进阶)

  • 简单变量的输出
  • 一维数组的输出
  • 二维数组的输出
  • 对象变量的输出

 

3.1、一维数组

ThinkPHP中变量的分配(不考虑变量类型)都是使用assign语法格式:

$this -> assign(‘模版中的变量’,php中变量);

 

在控制器中定义一个一维数组:

 

 

php中输出数组的具体元素可以通过下标的形式输出:$array[key]

关于数组在模版中输出的语法格式:

支持中括号形式:{$array[key]}

支持点形式:{$array.key}

定义模版并且输出:

 

 

两种形式在输出的效果上没有什么区别,所以在实际开发的时候,两种任意一种都可以使用。

3.2、二维数组

在方法中定义一个二维数组,然后将其分配到模版中:

 

 

在二维数组中:点形式和中括号形式,同样适用

模版中代码:

 

输出效果:

 

3.3、对象变量

对象在实例化之后一般会保存到一个变量当中去,这个变量也可以被分配到模版当中去。

得创建一个对象:

 

存储位置位于Admin/Controller/Student.class.php

 

类的实例化:

 

需要注意:在命名空间的语法要求中,如果不写命名空间(也不使用includerequire),系统会默认先去当前空间下去寻找需要的元素,如果找不到,则报错

 

为了在后期使用中文的时候不乱码,可以在入口文件(index.php)中添加一个header声明字符集:

 

 

在方法中打印对象:

 

 

 

将对象变量分配到模版中去展示:

 

php中如何去输出一个对象的属性?可以通过$obj -> attr/$obj :: attr这种形式输出对象的属性。

 

ThinkPHP的模版中输出属性的值,可以通过下面的两种方式来实现:

支持箭头形式:{$obj -> attr}

支持冒号形式:{$obj : attr}

 

 

切记:在ThinkPHP模版中,在输出对象的属性的时候,千万不要使用点形式,因为ThinkPHP不允许将对象作为数组使用,会提示以下的错误

 

 

冒号形式和箭头形式的输出结果:

 

4、系统变量

ThinkPHP中系统提供了以下几个系统级别的变量(超全局变量在模版中的使用):

  • $Think.server 等价于$_SERVER,获取服务器的相关信息
  • $Think.get 等价于$_GET,获取get请求的信息
  • $Think.post 等价于$_POST,获取post请求中的信息
  • $Think.request 等价于$_REQUEST,获取getpost中信息
  • $Think.cookie 等价于$_COOKIE,获取cookie中的信息
  • $Think.session 等价于$_SESSION,获取session中的信息
  • $Think.config 获取ThinkPHP中所有配置文件的一个总和,如果后面指定了元素,则获取指定的配置

 

上述7个系统变量的语法都是一样的,在模版中使用的语法格式是:

{$Think.xxx.具体的元素下标}

例如:需要获取get请求中的id,则可以写成{$Think.get.id}

 

案例:在模版中输出其中的部分变量信息。

 

在控制器中定义一个方法,输出模版:

 

 

模版中输出:

 

输出结果:

 

5、视图中使用函数(重点)

在实际开发的时候,有些变量在模版中不能直接使用,举个栗子:在数据表中存储的时间一般都是时间戳格式,在展示的时候需要处理格式化,需要遍历,操作相对而言比较繁琐。这个时候可以使用视图中使用函数的方式来解决这个问题。

 

语法格式:

{$变量|函数名1|函数名2=参数1,参数2,###}

 

参数说明:

$变量:模版变量

|:变量修饰符

函数名1:表示需要使用的第一个函数

函数名2:表示需要使用的第二个函数

参数1、参数2:函数2的参数

=:其实就是表示该函数有参数,类似于php中的函数名后面的()

###:表示变量的自身

 

案例1(经典):时间戳的格式化。(100%工作中使用)

 

分析:格式化时间戳使用的函数是date,语法格式是date(‘Y-m-d H:i:s’,时间戳);

 

 

输出结果:

 

 

特别说明:

第一:###什么时候该写,什么不该写?当需要使用的函数只有一个参数并且参数是变量自身的时候,###可以省略不写;当需要使用的函数有多个参数,但是其第一个参数是变量自身的时候,也可以省略不写###

第二:关于函数名的说明,函数名对应的函数必须是php内置的函数或者是在函数库文件中定义好的函数;其他的主观臆造的函数不能使用。

 

案例2:定义一个字符串,截取其中的前5个字符,并且将其转化成大写

 

分析:截取字符串使用函数substr,转化大写使用函数strtoupper

 

实现的效果:

 

6、默认值

使用场景:在论坛的用户个性签名处,一般会看到一句提示“这个家伙很懒,什么都没留下…”,这句话只有当用户的个性签名没有填写的时候才会显示。

 

默认值:就是当某个变量不存在或者为空的时候,就会显示默认的字符,默认的字符就是变量的默认值。

 

语法:

{$变量名|default=默认值}   集合视图中使用函数的语法格式,可以得知default其实是ThinkPHP中封装的一个函数,默认值是函数的参数

 

默认值的使用:

 

显示结果:

 

7、运算符

ThinkPHP中同样支持在模版中对变量进行运算:

  • + {$a+$b} 计算变量a加上变量b的结果
  • - {$a-$b} 计算变量a减去变量b的结果
  • * {$a*$b} 计算变量a乘以变量b的结果
  • / {$a/$b} 计算变量a除以变量b的结果
  • % {$a%$b} 计算变量a除以变量b的余数
  • ++ {$a++} {++$a} 自增运算
  • -- {$a--}   {--$a} 自减运算

 

在方法中定义变量a和变量b传递给模版展示计算结果:

 

在模版中进行运算:

 

运算结果:

 

8、文件包含

在实际开发的时候一般情况会把网站的公共部分,如头部、尾部等部分可以单独的存放到一个文件中,在后期的时候可以直接引入该部分,在后期维护的时候只需要维护一份代码就可以;如果说首尾等公共部分不单独拿出来,会造成2个问题,一个是代码重复,再者就是在后期维护的时候很麻烦。

 

ThinkPHP中系统提供了一个模版标签,可以让我们引入一些公共部分的代码文件,这个标签是include标签:

<include file=’需要引入的模版文件’ />

说明:路径可以是相对路径,但是相对于入口文件的。

案例:使用include的标签语法,来实现页面的首尾引入效果。

先创建出三个模版文件(顶部、body、尾部):

 

显示方法:

 

模版中的引入代码:

 

效果:

 

 

说明:在实际开发的时候,上述的路径很长还很容易写错。往往我们还会将其写成另外一种比较简单的方法:

<include file=’View目录名/模版文件名’ />

上述的代码可以改写成:

 

除了使用include标签来引入文件之外,include标签还有另外一个用法:用来传递参数给引入的模版文件。

<include file=’需要引入的模版文件参数名=参数值’ />

上述的语法格式是给引入文件传递一个参数,参数名的名字就是后面的参数名,值就是后面的值。

 

在目标文件中使用参数的位置写成下面的形式:

[参数名]

 

说明:如果目标文件中的参数[title]不存在,则[title]会被原样的输出到浏览器上。

 

9、循环遍历(重点)

ThinkPHP中系统提供了2个标签来实现数组在模版中的遍历:

volist标签、foreach标签。

 

Volist语法格式:

 

Foreach语法格式:

 

 

从上述的语法格式发现volist标签和foreach标签的语法结构上大体是一样的,那为什么系统还封装2个模版标签呢?

区别在于:volist除了上述的nameid属性对之外,还支持更多的属性对,如modkeylength等等,而foreach标签除了上述的nameitem之外只支持key属性对。可以理解成foreach标签是volist标签的一个简化版本。

 

后期在使用的时候可以根据实际情况选择性的使用volist标签和foreach标签。

9.1、一维数组遍历

 

在模版中遍历数组:

 

9.2、二维数组遍历

 

在模版中进行遍历:

 

遍历结果:

 

 

10if标签

If标签如果phpif语句的作用,if是用于流程控制的。

ThinkPHPif标签也是用于流程控制的。

If标签的语法格式:

<if condition=’条件表达式’>

输出结果1

<elseif condition=’条件表达式2’/>

输出结果2

<elseif condition=’条件表达式3’/>

<else/>

最后一个输出

</if>

 

案例:在php输出今天的星期数字,然后传递给模版,在模版中使用if标签判断今天是星期几。

 

在模版中编写if标签的判断代码:

 

显示效果:

 

 

 

 

11php标签

Php标签就是指在模版中使用php语法格式。

模版中的php标签ThinkPHP支持2种形式:

第一种:PHP内置的php标签;语法格式:<?php PHP代码段?>

第二种:ThinkPHP封装的php标签;语法格式:<php>PHP代码段</php>

 

分别使用两种php标签:

 

显示效果:

 

 

在实际开发的时候一般情况不建议在模版中使用php标签,在配置项中有一个配置项可以禁用php标签,配置项叫做:TMPL_DENY_PHP

 

禁用php标签之后,只是禁用掉原始的php标签,并不会禁用ThinkPHP封装的php标签。但是不建议禁用,原因是系统的跳转方法的模版文件使用了原生的php标签:

 

禁止使用原生的php标签错误提示:

 

二、ThinkPHP中的模型

1、配置数据库连接

数据库的连接配置项可以在系统的主配置文件中找到:

 

将上述的配置项复制粘贴到应用级别的配置文件中(一般一个应用使用一个数据库):

 

2、数据库/表创建

数据库名:db_oa

数据表名:sp_dept department

 

在数据库【本机数据库】上右击【新建数据库】,然后填写上数据库的相关信息。点击确定完成数据库的创建。

创建数据表sp_dept

 

打开数据库db_oa,然后点击【查询】,再点击【新建查询】,将sql语句贴近来,然后点击【运行】

 

然后邮件【表】,选择【刷新】,之后就可以查看到刚才新创建的数据表

 

3、什么是模型

模型是MVC三大组成部分的MModel),作用是负责与数据表的数据交互(CURD)。

 

4、模型的创建

命名规范:模型名(要求是不带前缀的表名并且首字母大写)+Model关键词+.class.php

代码结构规范:

第一步:声明命名空间;

第二步:引入父类模型Model.class.php

第三步:声明模型并且继承父类模型;

 

例如:创建一个部门模型文件。

命名:DeptModel.class.php

 

代码规范:

 

 

问:空模型能否进行数据表的基本操作(CURD)?

答:可以,因为模型继承了父类,所以可以执行基本的操作。

5、模型的实例化操作(重点)

模型虽然已经创建完成,但是由于模型的本质是一个类,类在使用的时候需要实例化操作。

5.1、普通实例化方法

普通实例化方法是指通过自己编写代码来new一个对象。

$obj = new 类名();

 

在控制器中定义一个方法来实例化模型,使用的是普通方式实例化:

创建部门控制器文件:

 

实例化代码:

 

实例化结果:

 

5.2快速实例化方法

上述的普通实例化方法虽然可以进行实例化操作,但是使用上比较麻烦,还需要考虑命名空间,所以ThinkPHP为了简单、快速、高效开发,为我们提供了2快速方法可以对模型进行实例化操作:

M方法和D方法。

 

D方法实例化:

$obj = D([‘模型名’]);

表达的含义:实例化我们自己创建的模型(分组/Model目录中);如果传递了模型名,则实例化指定的模型,如果没有指定或者模型名不存在,则直接实例化父类模型(Model.class.php

 

M方法实例化:

$obj = M([‘不带前缀的表名]);

表达的含义:直接实例化父类模型(Think目录下的Model.class.php);如果指定了表名,则实例化父类模型的时候关联指定的表;如果没有指定表名(没有传递参数)则不关联表,一般用于执行原生的sql语句(M() -> query(原生的sql语句))。

 

案例:使用快速方法DM方法对模型进行实例化操作。

 

 

 

实例化代码:

 

 

经典面试题:

问:实例化方法中D方法和M方法有什么区别?

答:D方法是实例化自定义模型,如果自定义模型不存在,则实例化父类模型;M方法本身就是直接实例化父类模型。两者的差异就是实例化的对象不一样。

 

在后期开发的时候怎么去选择是使用D方法还是M方法呢?

可以根据自身的情况,如果需要使用的操作父类中已经封装好了,则可以直接实例化父类(使用M方法),如果父类中方法不能满足我们的开发需要求,需要自己定义方法,则这个时候可以使用D方法实例化自定义模型。

 


6CURD操作

CURD操作也就是模型操作数据表的基本操作。CCreate)、UUpdate)、RRead)、DDelete)操作就是增删改查操作。

6.1、增加操作

回想一下在mysql中增加操作使用的语法格式是:insert into语句。

ThinkPHP中系统给我们封装好了模型中的方法,可以通过方法来实现数据的增加操作,这个方法叫做add方法:

$model -> add(一维数组);

一维数组要求必须是键值(关联)数组,键必须和数据表中字段名要匹配,如果不匹配则在增加的时候会被ThinkPHP过滤掉。

 

Add方法的返回值是新增记录的主键id

 

案例:往部门表中使用add方法添加一条记录。

 

返回值:

 

 

补充:如果需要添加多个记录怎么去实现呢?

方法1:可以循环使用add方法;

方法2:可以使用另外一个方法addAll,语法:$model -> addAll(二维数组);

要求:最里面的那层数组也是关联数组(也要求键名字和数据表字段匹配),外层数组必须是下标从0开始的连续索引数组

 

 

上述的addAll方法使用起来需要注意的点太多,谨慎使用。

 

6.2、修改操作

mysql中修改操作使用的是:update table语句。

ThinkPHP中使用的是save方法,语法格式:

$model -> save(一维关联数组);

条件需要一维关联数组必须要有主键信息。如果没有主键信息,则相当于批量修改,在ThinkPHP中,系统为了防止误操作,不允许批量修改。

 

案例:使用save方法实现部门表中财务部门的信息。

如果没有指定主键信息,则返回值是false

 

 

返回false,表示修改操作并没有执行,而不是指mysql执行失败

正常执行的结果:

 

返回值:

表示受到影响的行数:

 

6.3、查询操作

Mysql中查询操作使用的语法是:select语句。

ThinkPHP中系统封装了方法可以直接用于查询:select方法、find方法。

 

Select方法语法:

$model -> select();表示查询全部的信息

$model -> select(id);表示查询指定id的信息

$model -> select(‘id1,id2,id3,id4….’);表示查询指定id集合的信息,等价于mysqlin语句

 

Find方法语法:

$model -> find(); 表示查询当前表中的第一条记录,相当于limit 1;

$model -> find(id);表示查询表中的指定id的记录;

 

返回值:

Select方法返回值是一个二维数组,即时查询的是一条记录返回也是二维数组;find返回值是一维数组。

 

案例:使用select方法和find方法查询部门表中的数据。

 

6.4、删除操作

mysql中删除使用delete from语句。

ThinkPHP中可以使用系统封装的方法delete方法:

$model -> delete(); //不能使用,删除方法必须要有条件,不能执行没有条件的删除

$model -> delete(id);删除指定id对应的记录

$model -> delete(‘id1,id2,id3….’);删除多个id对应的记录

 

关于删除的说明:

删除分为两种删除:物理删除、逻辑删除。

物理删除:是指真删除。

逻辑删除:是指假删除,本质是修改操作。在数据表中定义一个状态字段,比如说status,取值是0或者1,在查询的时候读取状态是1的;当用户点击删除之后触发修改操作,将状态从1修改成0。因为查询只查询状态是1的,所以0的就不会被显示在页面上。

 

案例:使用delete方法实现删除操作。

 

 


三、作业 

功能一、使用curd操作方法,实现部门的添加功能。

功能二、使用curd操作方法,实现部门的展示功能。

posted @ 2019-09-20 14:29  ggsa202008  阅读(435)  评论(0编辑  收藏  举报