Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用null合并运算符时如何键入cast?_Php_Casting_Php 7_Null Coalescing Operator - Fatal编程技术网

Php 使用null合并运算符时如何键入cast?

Php 使用null合并运算符时如何键入cast?,php,casting,php-7,null-coalescing-operator,Php,Casting,Php 7,Null Coalescing Operator,假设我有这个: $username = (string) $inputs['username'] ?? null; 如果设置了$inputs['username'],则我希望将其转换为字符串。如果未设置,则$username应为null 但是,如果此时未设置$inputs['username'],则它将是一个空字符串,而不是null 我怎样才能解决这个问题?或者这是故意的行为?我不完全确定你想做什么,但看起来你选错地方了 您可以这样做: $username = $inputs['usernam

假设我有这个:

$username = (string) $inputs['username'] ?? null;
如果设置了
$inputs['username']
,则我希望将其转换为
字符串。如果未设置,则
$username
应为
null

但是,如果此时未设置
$inputs['username']
,则它将是一个空字符串,而不是null


我怎样才能解决这个问题?或者这是故意的行为?

我不完全确定你想做什么,但看起来你选错地方了

您可以这样做:

$username = $inputs['username'] ?? null;

// cast $username to string 
if ($username && $username = (string) $username){
   // your code here
}

我想您可以将null合并字符串类型转换的“false”值转换回null

$username = (string) ($inputs['username'] ?? '') ?: null;

它看起来有点奇怪,但我认为它不需要使用
isset
,就能产生你想要的东西。在这种情况下,
不重要,因为它永远不会被使用;它可能是任何错误的东西。

如果要在非null情况下返回的值与正在测试的值相同,则只能使用null coalesce运算符。但在你的情况下,你想在回来时投下它

因此需要使用常规条件运算符并显式测试值

$username = isset($input['username']) ? (string) $input['username'] : null;
老派:

<?php
$bar = null;
if(isset($foo))
    $bar = (string) $foo;

我认为可能发生的情况是,您正在将null用户名强制转换为字符串。然后coalesce操作符将空字符串视为一个值。因此,将设置该值,并返回空字符串。你为什么需要字符串类型的演员阵容?是的,你说得对。我用
??
来减少
isset()
代码,您通常会使用
?:
来处理类型需要严格执行的应用程序。谢谢,我的目标是使用
??
来减少代码,但似乎不可能在其中进行类型转换。啊。。我明白了……所以你想减少行数,让你的代码看起来很优雅,是吗?:)更具可读性/优雅,是的,因为这种模式被大量使用。虽然看起来很诱人,但这种“优雅”的问题在于,有时下一个家伙不容易阅读。如果目标是节省两三行空间,那么我认为这可能不值得谢谢Barmar,我想这意味着没有办法了,也就是说,这就是它的设计方式?我希望替换所有的
isset()
。它只能用于简化
isset(表达式)?表达式:null
。如果它与该模式不匹配,它将不起作用。这可以被引导到:
isset($foo)&&$bar=“$foo”
isset($foo) && $bar = (string) $foo;