PHP 类型声明和强类型声明

一、类型声明 及 返回值类型声明

类型声明 起始版本 说明
array 5.1 数组,默认值可以是null或数组
int 7.0

整数值,默认值可以是null或整数

float 7.0

浮点数值(一个带小数点的数值)。即使开启了严格模式,也可以接受整数。

默认值可以是null、浮点类型或整数

callable 5.4 可调用代码(如匿名函数),默认值可以是null
bool 7.0 布尔值,默认值可以是null或布尔值
string 5.0 字符数据,默认值可以是null或字符串
self 5.0 字符数据,指向自己的引用
[类类型] 5.0 类或接口的类型,默认值可以是null
void 7.1

只用于返回值类型声明,不可用于参数类型声明,否则报错

强类型检查模式下定义返回类型为 void 的方法不能有返回值,即使返回 null 也不行;或者使用一个空的 return 语句

 

使用:

 1 class A
 2 {
 3     /**
 4      * 举个例子
 5      * @param {Int} $a 变量$a被声明为整数
 6      * @param {Array} $b 变量$b被声明为数组
 7      * @return {Float} 返回值被声明为浮点型
 8      */
 9     public static function show(int $a, array $b): float
10     {
11         return $a . $b;
12     }
13 }

二、可空类型声明

可空类型主要用于参数类型声明和函数返回值声明

形式分以下两种:

 1 function a(): ?int  {
 2     return null; //ok
 3 }
 4  
 5 function a(): ?int  {
 6     return 42; // ok
 7 }
 8  
 9 function show(?string $msg) {
10     if ($msg) {
11         echo $msg;
12     }
13 }

意思为:所指的就是通过 ? 的形式表明函数参数或者返回值的类型要么为指定类型,要么为 null。

此方法也可用于接口函数的定义:

1 interface A{
2     function a(?A $f);
3 }

但有一个需要注意的地方:如果函数本身定义了参数类型并且没有默认值,即使是可空的,也不能省略,否则会触发错误。如下:

1 function a(?Bar $bar) {}
2  
3 a(new Bar); // 可行
4 a(null); // 可行
5 a(); // 不可行

但是如果以上函数的参数定义为 ?Bar $bar = null 的形式,则第三种写法也是可行的。因为 = null 实际上相当于 ? 的超集,对于可空类型的参数,可以设定 null 为默认值。

 

类函数中对于返回类型的声明也不能被子类覆盖,否则会触发错误:

 1 class A
 2 {
 3     public function show(): void {
 4     }
 5 }
 6  
 7 class B extends A
 8 {
 9     public function show(): array {
10      // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void
11     }
12 }

 

三、强类型声明(严格校验模式)

  • 默认情况下,所有的PHP文件都处于弱类型校验模式,弱类型校验模式下如果参数不符合声明类型,将会按照php的规则进行转换。
  • 通过指定strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。
  • declare(strict_types=1)必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被明确禁止的。
  • strict_types指令只影响指定使用的文件,不会影响被它包含(通过include等方式)进来的其他文件。该指令在运行时编译,不能修改。它的运作方式,是在opcode中设置一个标志位,让函数调用和返回类型检查符合类型约束。

以下代码会被按照php的规则转换:

 1 class A
 2 {
 3     // 类型声明$a为布尔型
 4     public static function show(bool $a)
 5     {
 6         var_dump($a);
 7     }
 8 }
 9 // 却传入字符型
10 A::show('flase'); // 结果为:boolean true

但如果在文件第一行加上 declare(strict_types=1);

便会开启严格效验模式

1 <?php
2 declare(strict_types=1);
3 // ...
4 A::show('flase'); // 报错

 

posted @ 2020-10-16 22:25  九鹤  阅读(1872)  评论(0编辑  收藏  举报