【问题标题】:Assign if variable is set如果设置了变量,则赋值
【发布时间】:2012-11-17 13:33:31
【问题描述】:

在 PHP 中,我发现自己经常编写这样的代码:

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;

有没有更简单的方法来做到这一点?最好是不需要我写两次$the->very->long->variable[$index]

【问题讨论】:

  • 通过工作 OOP 并使用 __get 和 __set?
  • @DaHaKa:这可能会在具有良好设置的服务器上发出警告 (E_STRICT | E_ALL)
  • 如果您经常使用相同的长变量,则可以使用引用:$ref = $the->very->long->variable; $a = !empty($ref[$index]) ? $ref[$index] : null; $b = !empty($ref[++$index])...,或者正如@Bondye 指出的那样,使用魔法 getter 方法,并将其设置为返回 null 或属性值
  • 看起来->variable 可以实现/包装到ArrayAccess 并在offsetGet 操作中为未设置的索引默认返回NULL。 - 也请仔细检查潜在的重复,你可以在这个网站上找到一些宝石。
  • 也许 monad 可能适用于此,尽管我不太了解它可以肯定地说:github.com/ircmaxell/monad-php

标签: php variables


【解决方案1】:

一个更新,因为 PHP 7 现已推出,并且在这一点上改变了游戏规则;前面的答案是关于 PHP 5 的。

PHP 7 解决了这个问题。因为你说用 PHP 写这个很常见,这绝对不优雅。

在 PHP 7 中出现了 Null Coalesce Operator (RFC),它是 isset 三元条件的完美简写。

它的目标是替换这种类型的条件:

$var = isset($dict['optional']) ? $dict['optional'] : 'fallback';

这样:

$var = $dict['optional'] ?? 'fallback';

更好的是,空合并运算符是可链接的:

$x = null;
# $y = null; (undefined)
$z = 'fallback';

# PHP 7
echo $x ?? $y ?? $z   #=> "fallback"

# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)

null coalesce 运算符的作用与 isset() 完全一样:在以下情况下采用主题变量的值:

  • 变量已定义(存在)
  • 变量不为空

请注意 PHP 初学者:如果您使用三元条件但您知道必须定义主题变量(但您希望 falsy 值的后备),则有 Elvis operator

$var = $dict['optional'] ?: 'fallback';

使用 Elvis 运算符,如果 $dict['optional'] 是无效偏移量或 $dict 未定义,您将收到 E_NOTICE 警告(PHP 5 和 7)。这就是为什么在 PHP 5 中,人们使用可怕的 isset a ? a : b 当他们不确定输入时的形式。

【讨论】:

  • 干得好@Morgan 用新答案更新了这个!谢谢。
【解决方案2】:

很遗憾没有,因为RFC 已被拒绝。因为isset 不是一个函数,而是一个语言结构,所以你不能为这种情况编写自己的函数。

注意:因为这是一种语言结构而不是函数,所以不能使用变量函数来调用它。

【讨论】:

    【解决方案3】:

    假设您知道 $the->very->long->variable 已设置,并且您只是担心数组索引......

    $x = $the->very->long->variable;
    $a = isset($x[$index]) ? $x[$index] : null;
    

    或者对于您可以在代码周围使用的更通用的变体:

    function array_valifset($arr,$k, $default=null) {
        return isset($arr[$k]) ? $arr[$k] : $default;
    }
    

    然后为任何数组值这样调用它:

    $a = array_valifset($the->very->long->variable,$index);
    

    【讨论】:

    • 谢谢。我希望我只是忽略了一个内置功能。显然情况并非如此。
    • 不。正如@eisberg 所说,PHP 开发人员明确拒绝了简写 isset 解决方案。 :-( 我相信他们有他们的理由。
    【解决方案4】:

    如果你只分配null而不是未设置的变量,你可以使用:

    $a = @$the->very->long->variable[$index];

    @ 使该指令不出错

    【讨论】:

      【解决方案5】:

      我偶然发现了同样的问题,发现引用数组元素不会发出通知或警告,而是返回 null(至少 PHP 5.6)。

      $foo = ['bar' => 1];
      
      var_dump($bar = &$foo['bar']); // int 1
      var_dump($baz = &$foo['baz']); // null
      

      在 if 语句中:

      if($bar = &$foo['bar']) {
          echo $bar;
      }
      if($baz = &$foo['baz']) {
          echo $baz;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 2013-08-08
        • 1970-01-01
        • 2020-03-19
        • 2013-08-27
        • 2013-03-23
        • 1970-01-01
        相关资源
        最近更新 更多