在PHP7之前,函数和类方法不需要声明变量类型
,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格。
为了解决这个问题,PHP7引入了类型声明。
目前有两类变量可以声明类型: 形参,返回值。
支持的类型有整形,浮点型,字符串型,布尔型。
简单的代码演示
public function demo(int $num)
{
return $num;
}
public function aa()
{
return $this->demo(11);
}
上面代码的demo方法定义形参的类型为int类型,浏览器访问调用aa方法返回值为11
这时候如果传入字符串类型的参数进去
public function aa()
{
return $this->demo('你好');
}
浏览器访问调用aa方法直接报错
而有些情况下,php判断也是不严谨的
public function demo(int $num)
{
return $num;
}
public function aa()
{
return $this->demo('11');
}
这个时候传入进去的参数其实是字符串,但是浏览器访问调用aa方法没有报错,返回值为11,所以这样就不算严谨了
在php7后面的版本中引入了开启严格模式去解决上面的问题
关键字declare
如要强制性约束类型,可在文件头部添加declare声明:
开启了严格模式之后
这时候在测试一下上面的案例,发现编辑器语法上面就已经报错了,浏览器运行一下果然报错:
只有严格定义传入的参数是int类型才可以
如果不做类型强制约束,那么PHP会将返回的数据转化为指定类型的数据再返回,目前差不多只有string无法强转为int才会报错。
如果指定了强制约束,那么PHP将不会进行类型转换,而是进行对比,如类型不同,则报错。
返回类型声明
第一次看到这种写法觉得很陌生,也是php7后面引进的写法
<?php
declare(strict_types=1);
//php7中引入的内容 strict_types=1 针对参数类型开启严格模式,进行数据类型检验,默认是弱类型校验
// 哪个文件写了declare,哪个文件中的所有代码就需要检查
namespace app\admin\controller;
class Index
{
public function demo(string $num): string
{
return $num;
}
public function aa()
{
return $this->demo('测试内容');
}
}
demo方法形参的括号后面加冒号加类型即可指定方法返回值的类型,指定了什么类型返回的就是什么类型,上面demo方法的形参定义为string类型,返回值的类型也定义为string类型
稍微改变一下
<?php
declare(strict_types=1);
//php7中引入的内容 strict_types=1 针对参数类型开启严格模式,进行数据类型检验,默认是弱类型校验
// 哪个文件写了declare,哪个文件中的所有代码就需要检查
namespace app\admin\controller;
class Index
{
public function demo(int $num): int
{
return $num + 10.5;
}
public function aa()
{
return $this->demo(11);
}
}
这时候开启严格模式,规定demo方法返回值的类型为int类型,浏览器运行一下就报错了
因为返回的值类型是float浮点类型,而不是定义的int类型