【问题标题】:default affectation in PHPPHP中的默认效果
【发布时间】:2026-01-24 13:15:01
【问题描述】:

编辑:我的错,我犯了一个错误,当我在这篇文章中说 null 时,我的意思是说 null 或空或零或假或任何使 (!$x) 为真的东西。

与朋友一起,我们正在尝试找到在变量为空时影响变量值的最佳方法。 我们想这样做:

if (!$x)
    $x = 5;

我的朋友建议了一种单行解决方案:

!$x && $x = 5;

这里,如果 $x 为空,那么 $x = 5 将被 PHP 解释,因此 $x 将包含 5。 如果 $x 不为 null,则不会读取该行的第二部分,并且 $x 将保留其旧值。

简历:
$x null:一次获取,一次比较,一次设置。
$x 不为空:一次获取,一次比较

我试着做得更干净更好。首先,我想到了这个:

$x = $x ? $x : 5;

但是这里如果 $x 之前不为空,那么 PHP 会做一个额外的做作 ($x = $x),另外,这一行比上一行要长。 简历:
$x null:一次获取,一次比较,一次设置。
$x 不为空:两次获取,一次比较,一组($x = $x)。

然后我来了:

$x = $x ?: 5;

我们的操作比前一个少,而且我们的字符比第一个少。 简历:
$x null:一次获取,一次比较,一次设置。
$x 不为空:一次获取,一次比较,一组 ($x = $x)。

但我的问题是,当 PHP 必须这样做时:

$x = $x;

真的在做吗?如果不是,第三种解决方案(最后一种)是最好的。否则,第一个解决方案是最好的。

还有其他解决方案可以解决这个问题吗?

谢谢。

【问题讨论】:

  • 请记住:nullfalse 不同
  • 这在很大程度上取决于上下文。理想情况下,您将从编写简短的自包含函数开始,因此$x 可以是具有默认值的函数参数。那么这个问题就没有意义了。除此之外,随心所欲;但请注意,更少的代码不一定是理想的目标。结果必须可读且易于理解,而不是尽可能地混淆。
  • 假设您正在寻找“最快”中的“最佳”,那么您自己尝试一下是无可替代的!

标签: php operator-keyword ternary


【解决方案1】:

“最好的”解决方案总是比较类型

if ($x)

这个 if 等价于

if ($x == true)

但又不一样

if ($x === true)

这个:

if (!$x)

一样
if ($x != true)

向你展示这背后的问题试图缩短它:

$x = false;

if (!$x)
    $x = 5;

falsenull(!$x) 中都评估为真。

当你想确定时,你不会缩短它。 最好的是严格比较:

$x = ($x !== null) ? $x : 5;

正如 deceze 已经说过的,缩短代码可能会导致混乱。 $x 可以有不同的值,当您不严格将其与所需内容进行比较时,会导致意外行为。例子:

$x = '';
$x = null;
$x = false;
$x = 0;
$x = 1;
$x = new stdClass;

当您将所有这些都放入没有严格比较的 if (if ($x)) 时会发生什么?

充分利用:

if ($x === null)
if ($x !== false)
if ($x !== 0)
if ($x instanceof stdclass)

【讨论】: