PHP7中类型声明前的问号是什么意思?(例如?string或?int)

39

请告诉我这个叫什么??stringstring

使用示例:

public function (?string $parameter1, string $parameter2) {}

我想了解有关它们的信息,但在PHP文档和谷歌中都找不到。它们之间有什么区别?

4个回答

42

什么是可空类型?

在 PHP 7.1 中引入的功能。

通过在类型名前加上问号来标记参数和返回值的类型声明,现在可以将其标记为可空。这表示除了指定的类型外,还可以传递 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字符串类型的参数:

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或指定的类型。

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
}

属性类型(PHP 7.4 版本)

属性的类型可以是可为空类型。

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
}

另请参阅:

可空联合类型(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)

运算符应该被移除。

PHP 7.1及以上版本

function foo(?int $value) { }

PHP 7.0或更低版本

/** 
 * @var int|null 
 */
function foo($value) { }

参考资料

PHP 7.1开始:支持可为空类型

PHP 7.4开始:类属性类型声明。

PHP 8.0开始:支持可为空联合类型。


只是一个提醒 - 可选参数不需要问号: function foo(int $val = null) { var_dump($val); }。然而,对于返回类型要小心: function foo(int $val = null): int { return (int)$val; } - 调用 foo(); - undefined

4

在您的函数参数中,string 前面的问号表示可为空类型。在上面的例子中,$parameter1 可以 具有 NULL 值,而 $parameter2 不行;它必须包含有效的字符串。

具有可为空类型的参数没有默认值。如果省略,则该值不会默认为 null,并将导致错误:

function f(?callable $p) { }
f(); // 无效;函数 f 没有默认值


1

1
这大致相当于

标签的闭合


 public function (string $parameter1 = null, string $parameter2) {}

除非参数仍然是必需的,否则将发出错误提示,如果省略参数。

在这种情况下,第二个参数是必需的,使用=null会使第一个参数变为可选项,但实际上并不起作用。当然它可以工作,但我的意思是它实际上并没有使其成为可选项,这是默认值的主要目的。

因此,使用

public function (?string $parameter1, string $parameter2) {}

在这种情况下,从语法上讲更有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接