首页 > 解决方案 > ?int $number 和 int $number = null 有什么区别?

问题描述

鉴于这个解释

可空类型:参数和返回值的类型声明现在可以通过在类型名称前加上问号来标记为可空。这表示除了指定的类型外,NULL 也可以分别作为参数传递或作为值返回。

https://www.php.net/manual/en/migration71.new-features.php

以下代码:


public function test(?int $var) {

}

表示test()可以用$varasint或 as调用null

以下代码:


public function test(int $var = null) {

}

test()可以用$varasintnullas well调用的方法。

这两种方法有什么区别?这些中的任何一个都比另一个更高效吗?

标签: php

解决方案


区分这里讨论的两种语言特性很重要,即类型声明默认参数值

第一个函数只使用类型声明,这意味着输入参数必须是类型intor NULL

第二个函数同时使用类型声明和默认参数值,这意味着参数必须是类型intNULL 如果省略,它将默认为NULL.

使用你的第一个函数,如果你只是简单地调用test()而不传递任何东西,你会得到:

PHP 致命错误:未捕获的 ArgumentCountError:函数 test() 的参数太少 [...]

这是正确的,因为函数期望intNULL但都没有,而对于第二个,因为你已经用默认值定义了参数,它会运行没有错误。

代码

function test(?int $var) {
  var_dump($var);
}

function test2(int $var = null) {
  var_dump($var);
}

test(1); // fine
test(); // error
test2(1); // fine
test2(); // fine

就性能而言,差异可能可以忽略不计,没有什么大到足以引起关注的地方。

现场示例

重复


推荐阅读