如何将可为空的变量转换为不可为空的类型?

时间:2019-02-24 17:58:10

标签: php string php-7 null-coalescing-operator

我有将接收参数?string

的函数
public function func(?string $x): string
{
    $x = trim(strtolower($x));
    $x = preg_replace('/\s+/', ' ', $x);
    $x = str_replace(' ', '-', $x);
    return $x;
}

运行./vendor/bin/phpstan analyse会出现以下错误:

Parameter #1 $str of function strtolower expects string, string|null given.              
Parameter #3 $subject of function preg_replace expects array|string, string|null given.  
Parameter #3 $subject of function str_replace expects array|string, string|null given.   

strtolower需要string,而preg_replacestr_replace需要array|string

什么是无需更改即可解决此问题的最佳方法从?string $xstring $x的参数?
换句话说,如何将var类型从string|null更改为string

2 个答案:

答案 0 :(得分:1)

我相信您也许可以打字输入$x的值

示例:

function foo(?string $x) : string {
    $a = (string) $x;

    return $a;
}

这应该产生,

var_dump(foo("test"));

string(4) "test"

然后

var_dump(foo(null));

string(0) ""

希望这就是您想要的。

答案 1 :(得分:1)

虽然PHP可以通过强制转换将null转换为空字符串,但您实际上必须问自己为什么这个函数甚至应该首先接受null值。

如果null表示您有$x的某个默认值,那么这似乎很合乎逻辑,如果$x为null,则可以使用null合并将$x设置为默认字符串值。

$x = $x ?? 'default';

但是,可以通过在签名中定义“默认”来更有效地解决上述问题:

function func(string $x = 'default')

但是根据您的代码,确实没有任何理由将null传递给此函数。我认为,这是一种代码味道,不应允许。此函数仅适用于字符串,因此不允许以null开头。然后,使用者应先处理null值,然后再使用此功能。