PHP7 中类型声明之前的问号(?字符串或 ?int)的用途是什么?
2022-08-30 16:09:41
你能告诉我这是怎么叫的吗? 和?string
string
用法示例:
public function (?string $parameter1, string $parameter2) {}
我想了解一些关于它们的知识,但我在PHP文档和谷歌中都找不到它们。它们之间有什么区别?
你能告诉我这是怎么叫的吗? 和?string
string
用法示例:
public function (?string $parameter1, string $parameter2) {}
我想了解一些关于它们的知识,但我在PHP文档和谷歌中都找不到它们。它们之间有什么区别?
在 PHP 7.1 中引入,
参数和返回值的类型声明现在可以通过在类型名称前面加上问号来标记为可为 null。这表示除了指定的类型之外,NULL 可以分别作为参数传递或作为值返回。
function test(?string $parameter1, string $parameter2) {
var_dump($parameter1, $parameter2);
}
test("foo", "bar");
test(null, "foo");
test("foo", null); // Uncaught TypeError: Argument 2 passed to test() must be of the type string, null given,
在此示例中,您可以传递 或 参数:null
string
function acceptOnlyStrings(string ...$parameters) { }
function acceptStringsAndNull(?string ...$parameters) { }
acceptOnlyStrings('foo', null, 'baz'); // Uncaught TypeError: Argument #2 must be of type string, null given
acceptStringsAndNull('foo', null, 'baz'); // OK
函数的返回类型也可以是可为 null 的类型,并允许返回或指定的类型。null
function error_func(): int {
return null ; // Uncaught TypeError: Return value must be of the type integer
}
function valid_func(): ?int {
return null ; // OK
}
function valid_int_func(): ?int {
return 2 ; // OK
}
属性的类型可以是可为 null 的类型。
class Foo
{
private object $foo = null; // ERROR : cannot be null
private ?object $bar = null; // OK : can be null (nullable type)
private object $baz; // OK : uninitialized value
}
另请参阅:
可为 null 的联合类型(自 PHP 8.0 起)
截至 PHP 8,“?T
表示法被认为是 T|null
“ 常见情况的简写
class Foo
{
private ?object $bar = null; // as of PHP 7.1+
private object|null $baz = null; // as of PHP 8.0
}
如果运行的 PHP 版本低于 PHP 7.1,则会引发语法错误:
语法错误,意外的“?”,预期的变量(T_VARIABLE)
应删除该运算符。?
7.1 菲律宾比索
function foo(?int $value) { }
PHP 7.0 或更低版本
/**
* @var int|null
*/
function foo($value) { }
从 PHP 7.4 开始:类属性类型声明。
从 PHP 8.0 开始:可为 null 的联合类型
in 函数参数前面的问号表示可为 null 的类型。在上面的示例中,必须允许具有值,而不是;它必须包含有效的字符串。string
$parameter1
NULL
$parameter2
具有可为 null 类型的参数没有默认值。如果省略,则该值不会默认为 null,并将导致错误:
函数 f(?callable $p) { }
f();无效;函数 f 没有默认值