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

posted @ 2020-03-17 11:05  欢乐豆123  阅读(461)  评论(0编辑  收藏  举报