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

php
2022-08-30 14:37:41

给出这个解释

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

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

以下代码:


public function test(?int $var) {

}

表示可以使用 as 或 as 调用。test()$varintnull

以及以下代码:


public function test(int $var = null) {

}

表示也可以用 as 或调用。test()$varintnull

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


答案 1

区分此处讨论的两种语言功能(即类型声明默认参数值)非常重要。

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

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

以你的第一个函数为例,如果你只是简单地调用而没有向它传递任何东西,你会得到:test()

PHP 致命错误: 未捕获的参数计数错误: 参数太少,无法运行 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

就性能而言,差异可能可以忽略不计,没有什么重要到会引起关注。

实际示例

Repl


答案 2

如果该语言是今天设计的,则可能是一个错误,并且应该真正编写 。这两个部分意味着不同的东西:int $var = null?int $var = null

  • 指示 是该参数的有效值。?null
  • 指示如果未传递参数,则为默认值。= nullnull

但是,在引入语法之前,该语言中存在一种特殊情况:如果作为参数的默认值给出,则传递给该参数是合法的,即使类型声明会阻止它。?typenullnull


推荐