int $ number和int $ number = null有什么区别?

tom*_*hap 29 php

鉴于这种解释

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

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

如下代码:


public function test(?int $var) {

}
Run Code Online (Sandbox Code Playgroud)

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

和以下代码:


public function test(int $var = null) {

}
Run Code Online (Sandbox Code Playgroud)

test()可以用$varas int或as 调用的方法null

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

Scr*_*t47 30

重要的是区分此处讨论的两种语言功能,即类型声明默认参数值

第一个函数仅使用类型声明,这意味着输入参数必须int或类型NULL

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

使用第一个函数,如果仅调用test()而没有传递任何内容,则会得到:

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

这是正确的,因为该函数期望一个int或一个NULL都没有,但是对于第二个,因为您使用默认值定义了参数,所以它将运行而没有错误。

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
Run Code Online (Sandbox Code Playgroud)

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

现场例子

复制


IMS*_*SoP 12

如果该语言是今天设计的,那int $var = null可能是一个错误,应该真正编写出来?int $var = null。这两个部分的含义不同:

  • ?指示null是该参数的有效值。
  • = null说明null是默认的,如果该参数不通过。

但是,在?type引入语法之前,该语言有一种特殊情况:如果null将其作为参数的默认值给出,则null即使该类型声明会阻止使用该参数,也可以将其传递给该参数是合法的。