php类型声明和约束 日期:2023-05-19 栏目:计算机分类:1 人气:1139 ### 标量类型声明 PHP从5.0开始已经有对支持`class`和`interface`参数类型声明,PHP5.1支持`array`以及PHP5.4支持`callable`。这些类型声明让PHP在执行的时候传入正确的参数,让函数签名具有更多的信息。 从PHP7开始,`int`、`float`、`string`和`bool`会被识别为类型声明,可用于函数返回值类型和参数类型声明 ``` <?php function sum(int $a, int $b): string { return $a + $b; } var_dump(sum(1, 2)); ``` 运行以上代码正常,结果为:string(1) "3" 弱类型校验模式下如果参数不符合声明类型,将会按照php的规则进行转换 PHP7.1添加了可空类型的声明方式并增加了`void`做为函数返回值类型,强类型检查模式下定义返回类型为 `void` 的函数不能有返回值,即使返回 `null` 也不行: ``` declare(strict_types=1); function returns_one(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } ``` 此外 void 也只适用于返回类型,并不能用于参数类型声明,否则会触发错误: ``` function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type } ``` ### 可空类型声明 可空类型主要用于参数类型声明和函数返回值声明。 主要的两种形式如下: ``` function answer(): ?int{ return null; //ok } function answer(): ?int{ return 42; // ok } function say(?string $msg) { if ($msg) { echo $msg; } } ``` 从例子很容易理解,所指的就是通过 `?` 的形式表明函数参数或者返回值的类型要么为指定类型,要么为 `null`。 此方法也可用于接口函数的定义: ``` interface Fooable { function foo(?Fooable $f); } ``` 但有一个需要注意的地方:**如果函数本身定义了参数类型并且没有默认值,即使是可空的,也不能省略,否则会触发错误。** 如下: ``` function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // 可行 foo_nullable(null); // 可行 foo_nullable(); // 不可行 ``` 但是如果以上函数的参数定义为 `?Bar $bar = null` 的形式,则第三种写法也是可行的。因为 `= null` 实际上相当于 `?` 的超集,对于可空类型的参数,可以设定 `null` 为默认值。 类函数中对于返回类型的声明也不能被子类覆盖,否则会触发错误: ``` class Foo { public function bar(): void { } } class Foobar extends Foo { public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void } } ``` ### null和false PHP 8.2 又引入了两个新的类型,null 和 false。 在此之前,null 类型只能和其它类型一起使用。 比如:?int,是 int 或 null;bool 是逻辑类型。 ### 严格校验模式 `strict_types/declare()`指令 默认情况下,所有的PHP文件都处于弱类型校验模式。新的`declare`指令,通过指定`strict_types`的值(1或者0),`1`表示严格类型校验模式,作用于函数调用和返回语句;`0`表示弱类型校验模式。 `declare(strict_types=1)`必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被明确禁止的。 类似于`encoding`指令,但不同于`ticks`指令,`strict_types`指令只影响指定使用的文件,不会影响被它包含(通过`include`等方式)进来的其他文件。该指令在运行时编译,不能修改。它的运作方式,是在`opcode`中设置一个标志位,让函数调用和返回类型检查符合类型约束。 ``` <?php declare(strict_types=1); function sum(int $a, int $b):string { return $a+$b; } var_dump(sum(1, 2)); ``` 以上代码不符合函数的返回值类型声明,将抛出TypeError的错误 ``` <?php declare(strict_types=1); function sum(string $a, string $b): string { return $a+$b; } var_dump(sum(1, 2)); ``` 以上代码不符合函数的参数类型声明,也会抛出错误 有一个例外的是,宽泛类型转换是允许`int`变为`float`的,也就是说参数如果被声明为`float`类型,但是它仍然可以接受`int`参数。 ``` <?php declare(strict_types=1); function sum(int $a, int $b): float { return $a+$b; } var_dump(sum(1, 2)); ``` 以上代码运行正常 在这种场景下,我们传递一个`int`参数给到定义接受`float`的函数,这个参数将会被转换为`float`。除此之外的转换,都是不被允许的。 ### 鸣谢 - [csdn**咸鱼生气了 **](https://blog.csdn.net/weixin_42514540/article/details/115126107) 标签: php 类型 上一篇:如何使用mvn命令导入依赖 下一篇:本地开发和调试composer包 随便看看 2024-02-19 PHP7 运算符“??” 和“?:”的区别 2022-11-30 Linux 后台运行命令 2022-11-25 关于我们 2022-11-30 centos一键系统安装lnmp集成环境 2022-11-30 linux 生成 ssh 公钥 留言