zoukankan      html  css  js  c++  java
  • 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.标量、对象、接口、数组、函数类型

    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

  • 相关阅读:
    Codeforces 379 F. New Year Tree
    「NOI2018」屠龙勇士
    「NOI2018」归程
    深入理解Java枚举类型(enum)
    2018.6.9-学习笔记
    String、StringBuffer与StringBuilder介绍
    HashMap和HashTable到底哪不同?
    HashMap详解
    List,Set和Map详解及其区别和他们分别适用的场景
    Java中高级面试题(1)
  • 原文地址:https://www.cnblogs.com/hld123/p/12509329.html
Copyright © 2011-2022 走看看