PHP类型约束
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、标量、对象、接口、数组、函数类型
1 <?php 2 3 /** 4 * @param string $name 5 * @param int $age 6 * @param float $height 7 * @param bool $isBoy 8 */ 9 function sayInfo(string $name, int $age, float $height, bool $isBoy) 10 { 11 echo '姓名:' . $name . ',年龄:' . $age . ',身高:' . $height . ',是否为男孩:' . ($isBoy ? '是' : '否'); 12 } 13 14 sayInfo("小明", 16, "170cm", true); 15 16 // 输出结果 17 // 姓名:小明,年龄:16,身高:170,是否为男孩:是
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)