【问题标题】:PHP: Assign if not empty?PHP:如果不为空,则分配?
【发布时间】:2011-01-14 22:02:31
【问题描述】:

PHP 中是否有任何形式的 assign-if-not-empty-otherwise-assign-null 函数?

我正在寻找一种更清洁的替代方案:

$variable = (!empty($item)) ? $item : NULL;

如果我能指定默认值也会很方便;例如,有时我想要 ' ' 而不是 NULL。

我可以编写自己的函数,但有本地解决方案吗?

谢谢!

编辑:应该注意的是,我试图避免通知未定义的值。

【问题讨论】:

  • !empty($item) && ($variable = $item);
  • @Delta:那么默认值会怎样?
  • @Delta 不行,$item 为空时不会初始化$variable

标签: php


【解决方案1】:

更新

PHP 7 添加了a new feature 来处理这个问题。

已添加空合并运算符 (??) 作为语法糖 对于需要结合使用三元的常见情况 伊塞特()。如果存在且不为 NULL,则返回其第一个操作数; 否则返回第二个操作数。

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

原答案

我最终只是创建了一个函数来解决问题:

public function assignIfNotEmpty(&$item, $default)
{
    return (!empty($item)) ? $item : $default;
}

请注意,$item 通过引用传递到函数。

使用示例:

$variable = assignIfNotEmpty($item, $default);

【讨论】:

  • 在函数定义中需要引用,而不是在函数调用中。 $variable = assignIfNotEmpty($item, $default); 仍然通过引用获得 $item。见php.net/manual/en/language.references.pass.php
  • @elreimundo:谢谢。已编辑。
【解决方案2】:

重新编辑:不幸的是,两者都会在未定义的变量上生成通知。我猜你可以用@ 来反驳。

在 PHP 5.3 中你可以这样做:

$variable = $item ?: NULL;

或者你可以这样做(如 meagar 所说):

$variable = $item ? $item : NULL;

否则不行,没有别的办法。

【讨论】:

  • 我不知道 PHP 5.3。那肯定更干净!
  • 如果未定义,这 (?:) 是否会生成通知?
  • Ish,我也想知道这个。这就是我要避免的。
  • @Ish Kumar:不幸的是。
  • 我猜$variable = @$item ?: NULL; 会更好。
【解决方案3】:

如果您有一个可为空的参数值并且想要设置一个默认值(如果它为空),那么空值合并赋值运算符 (??=) 会很有用。

function foo(?string $bar): void
{
    $bar ??= 'default';
}

【讨论】:

  • 在 PHP 7.4+ 上可用
【解决方案4】:

嗯,是的,有一个本地解决方案可以在未设置变量时分配值或 NULL:

$variable = $possibly_unset_var;

如果你只是想抑制通知(这并不能解决任何问题或使代码更清晰),也可以使用本机语法。

$variable = @$unset_var;

【讨论】:

  • 这是一个糟糕的解决方案(错误抑制),你不觉得吗?
  • @Peter:不,我不这么认为。通知的存在是有原因的,而不是毫无意义的烦恼。
  • 很差。 PHP 真的需要一个警告抑制操作符。
【解决方案5】:

我不建议在生产系统上这样做,但是:

<?php
//$value=1;
$item=@$value ?:null;
var_dump($item); // NULL
?>

<?php
$value=1;
$item=@$value ?:null;
var_dump($item); // 1
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2021-11-07
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多