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'); // 报错