PHP类型约束
一、导语
类型约束,即定义一个变量的时候,必须指定其类型,并且以后该变量也只能存储该类型数据。
PHP作为弱类型语言,其特点是无需为变量指定类型,而且在其后也可以存储任何类型,但是在PHP的新语法中,在某些特定场合,针对某些特定类型,也可进行语法约束。PHP 5开始,在面向对象中,为方法带来了类型约束,PHP 7完善了对类型限制的支持,补上了之前的短缺,包括标量类型、返回值类型。
PHP中接近完善的类型约束,降低了代码中一些因为类型约束而导致的问题。
二、演变过程
1. 早期的约束
虽然 PHP 是隐式转换,但是在实际开发中也会存在一些无法转换的窘境,当然这些问题我们在开发阶段很容易发现,但是如果是一些动态的内容导致不可控就会呈现在用户面前,也就是 BUG ,在 PHP 中有一批以 is_* 开头的方法用来做一些简单类型判断。
2. PHP 5+
只支持对象、接口、数组、函数类型约束
3. PHP 7+
增加了标量类型、返回值类型、可为空(Nullable)类型 (PHP 7.1)、Void函数,在 PHP 7.1 中还加入了严格类型验证
三、使用
1.标量、对象、接口、数组、函数类型
function f(类名 $p){} // 要求参数只能使用该类的对象
function f(接口名 $p){} // 要求该参数只能使用实现该接口的对象
function f(arrary $p){} // 要求该参数只能使用数组
function f(callable $p) // 要求该参数只能是一个函数(方法),此时称之为回调函数(方法)
在项目中的运用如下图:
说明:此处要求构造方法中的参数必须是EmailSenderBy163(邮件发送类)的对象
2、返回值类型
1)返回值类型,也可指定对象名,则必须返回指定对象的实例
2)如果不做类型强制约束,那么PHP会将返回的数据转化为指定类型的数据再返回,目前差不多只有string无法强转为int才会报错。如果指定了强制约束,那么PHP将不会进行类型转换,而是进行对比,如类型不同,则报错。
1 <?php 2 declare(strict_types = 1);//类型强制约束 3 4 class Address 5 { 6 public function getAddress() 7 { 8 return ['street' => 'shanghai', 'country' => 'China']; 9 } 10 } 11 12 class Person 13 { 14 public function a():int{//必须返回int类型,否则报错 15 return 1; 16 } 17 public function b():?int{//必须返回int类型或者null类型,否则报错 18 return 'das'; 19 } 20 public function age(float $age) : float 21 { 22 return $age; 23 } 24 25 public function name(string $name) : string 26 { 27 return $name; 28 } 29 30 public function isAlive(bool $alive) : string 31 { 32 return ($alive) ? 'Yes' : 'No'; 33 } 34 //返回的必须是Address类的实例 35 public function getAddress() : Address 36 { 37 return new Address(); 38 } 39 } 40 41 $person = new Person(); 42 var_dump($person->getAddress());
参考链接:https://segmentfault.com/a/1190000018807667