PHP7中的可空返回类型


159

PHP 7引入了返回类型声明。这意味着我现在可以指示返回值是某个类,接口,数组,可调用或新暗示的标量类型之一,对于函数参数而言,这是可能的。

function returnHello(): string {
    return 'hello';
}

通常,值并不总是存在,并且您可能返回某种类型的值或null。虽然您可以通过将参数的默认值设置为null(DateTime $time = null)来使参数为可空状态,但是似乎没有办法对返回类型执行此操作。确实是这种情况,还是我不知如何找到方法呢?这些不起作用:

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}

8
PHP7尚不允许空值返回类型,但是这里有一个RFC旨在解决这个问题。提案的注释应为function returnString(?string $stringNull) : ?string { return $stringNull;}
Elias Van Ootegem,2015年

1
我现在已经通过滥用应用程序中的异常来模拟可空性。如果你是罚款傻为好,这可能是有用的:github.com/JeroenDeDauw/OhMyPhp/blob/master/src/...
吉荣德Dauw

也许它可能会更有意义,使用PHP7 Trowable接口(具体地说,扩展TypeError
埃利亚斯凡Ootegem

Answers:


258

PHP 7.1现在支持可为空的返回类型。我链接到的第一个RFC是他们使用的RFC:

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

旧答案:

由于我的评论实际上是对该问题的答案:

PHP 7尚不支持可空的返回类型,但是有一个RFC可以解决这个问题,它的目标是加入PHP 7.1。如果通过,则语法将影响所有类型提示(返回类型和类型提示):

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

还有一个竞争性的RFC添加联合类型,该联合类型可以执行相同的操作,但外观有所不同:

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

不过,到目前为止,您必须编写:

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

或者只是返回一个空字符串以与返回类型一致,然后检查falsy值:

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}

5
PHP 7 won't support nullable return-types just yet, but there's an RFC out to address just that-是的,RFC,“还没有”。不要误会我的意思-我真的是PHP用户,因为到目前为止PHP3 实在是烂透了,没有缝隙,但是当我看到所有这些RFC拒绝了7时,我的印象仅仅是“ WTF ?!”。用户看到了混乱,并愿意以向后兼容的方式对其进行清理,而他们只是获得“否”。干净的方法命名混乱?固定null不是太特殊的公民?不,不需要。添加选项以使所有内容区分大小写吗?不。然后,人们切换感到惊讶。
Marcin Orlowski

1
@MarcinOrlowski:可以为空的返回类型提示很有意义。我遵循了几个RFC 7,并且大部分情况下我都拒绝了。他们关注的更改不是在语言上,而是在运行时和编译器上。对于某些被拒绝的RFC,值得仔细阅读讨论线程以了解为什么他们选择不实施那些更改(例如,弃用var)。可惜的是,他们确实接受了太多太多的东西(例如太空飞船的运营商)
Elias Van Ootegem

@EliasVanOotegem可空类型现已得到正确支持,因为7.1已于12月1日发布。
lonesomeday

@lonesomeday:的确如此,在我的答案的底部添加了链接+基本示例
Elias Van Ootegem

mmm ish是更新此答案的好类型!也就是说,PHP 7.1中似乎不支持联合类型
Dennis,2008年

67

Nullable Types在PHP 7.1中可用。

这是一个语法示例:

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1现在是GA,您可以从PHP 7.0升级(只有很少的向后不兼容的更改需要检查)


22
IMO在不实现“ nullable”的情况下传递返回类型声明是一个笑话。在实现“可空”功能之前,返回类型不可用。
joonas.fi,2016年

2
@ joonas.fi IMO严格类型化的返回值应始终为该类型,该合同不保留空返回值,而应引发异常,以使更多人理解空值的原因。
Steve Buzonas

8
@SteveBuzonas,如果您考虑在代表Person的对象上使用getAgeInYears()方法,您将如何为一个未告知我们年龄的人建模?返回空值?返回0?在语义上返回null表示“我们不知道”,而在语义上返回0表示“该人为0岁”。因此,我认为getAgeInYears():是最好的设计。对于特殊情况,应保留抛出异常。在大多数系统中不知道某人的年龄不应视为例外情况。
joonas.fi,2016年

@ joonas.fi非常正确,这是一种常见的做法。但是,您的实现现在需要注意该字段是可为空的,并相应地进行显式处理。x最好是x,除非为null,否则可以通过try / catch轻松实现。此外,如果实际上需要该可空字段中的值来继续执行,则异常可能是更好的选择。
Steve Buzonas

我注意到这种语法导致PHPMD抛出很多错误。希望他们能尽快解决。
汤姆·乔伊特

0

它适用于任何类型。
例:

public function getOpportunity(): ?Opportunity
{
    return $this->opportunity;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.