好段时间没写了,然后突然不知道写啥,刚刚想着貌似php7有个新的特征 数据类型约束
,那么一起来折腾折腾
认识数据类型约束
众所周知,在php中是对类型不约束,自动判定转换,不过嘛,在php7开始,出现了 数据类型约束
function myTestFun (int $num) {
return $num;
}
myTestFun("Mystr");
此时,我们在声明参数时,限定了为 int
类型,后面调用却是传入一个字符串,这时就会报 Fatal error
错误,因为我们传入的不是 int
类型
function myTestFun (bool $bo) {
return $bo;
}
var_dump( myTestFun("Mystr") ); // bool(true)
这时,我们定义一个传入需要 bool
类型的参数,但是我们代码执行却不会报错,输出true,为什么呢?原因嘛,字符串被自动转换成为了 true
,所以不会报错,但是,那么如何才能不让他自动转换呢,很简单,那就是通过声明 declare
开启严格模式
declare(strict_types = 1);
function myTestFun (bool $bo) {
return $bo;
}
var_dump( myTestFun("Mystr") );
这样的话,后边传入字符串,由于声明了严格类型约束,这里字符串将不再自动转换,所以这里会抱一个致命错误(Fatal error
),必须得传入 true
或 false
才行,哪怕是 1
或 0
都不行
刚刚说了传入参数类型约束,那么,返回值呢?能不能也约束呢?答案嘛,那是当然,还是上面的代码
declare(strict_types = 1);
function myTestFun (bool $bo) : int {
return (int)$bo;
}
var_dump( myTestFun(false) );
上面,我们通过在函数声明的括号后面使用 : 类型
来约束返回值类型,同样,受限于 declare
,返回值不会自动转换类型,如果返回类型和声明的返回类型不相符合,那么就会直接给一个致命错误,所以,声明声明返回类型就得返回什么类型
当然,返回类型也可以是对象,如下
class MyTest {
private string $name;
public function __construct(string $name){
$this->name = $name;
}
public static function NewTest(string $name) : MyTest {
return new MyTest($name);
}
}