【问题标题】:In PHP, is conditional variable substitution possible?在 PHP 中,是否可以进行条件变量替换?
【发布时间】:2011-06-04 18:49:37
【问题描述】:

我想知道在 PHP 中是否可以使用以下内容:

<?php echo "Hello {isset($name) ? $name : 'World'}!\n"; ?>

还是我必须执行以下操作?

<?php echo "Hello " . ( isset($name) ? $name : 'World' ) . "!\n"; ?>

一般来说,我更喜欢替换而不是串联,因为我发现字符串串联会使字符串过长,从而使字符串更难阅读。

其中的上下文是我正在根据数据库查询决定默认情况下应该选择 select 标记中的哪个选项。

完整的上下文:

<?php   
echo "
<form action='add_demographics.php' method='post'>
   <table>
      <input type=hidden name=userId value='{$_SESSION['username']}'/>
      <tr><td>User ID:</td><td>{$_SESSION['username']}</td></tr>";

foreach ($inputLabels as $i => $value)
{
    echo "
      <tr>
         <td>{$value['text']}</td>
         <td><select name=$i>";

    foreach ($value["options"] as $optionName => $optionValue)
    {
    echo "
            <option value=$optionValue {($result[$i]==$optionValue ? ' selected=true' : '')}>$optionValue</option>";
    }
    echo "
          </select></td>
      </tr>";
}

echo "
      <tr><td><input type='submit' name='submit' value='Submit' /></td></tr>
   </table>
</form>";
?>

【问题讨论】:

  • 我认为你想做的事情在一个字符串中是不可能的,不。
  • @Pekka:Dunes 正在使用 {},所以它可以正常工作
  • @shankhan:详细吗?据我所知,字符串中的{} 转义并不意味着您可以使用任意表达式并对其进行评估。
  • @shankhan 你是在告诉我这行得通吗? {isset($name) ? $name : 'World'} 怎么样?
  • @Pekka:当然可以。在您修改 PHP 源代码树之后。

标签: php variables ternary-operator substitution


【解决方案1】:

你可以这样做:

$default = "World";
$name = "Dunes";
echo "Hello {${isset($name) ? 'name' : 'default'}}";

来自 webbiedave 的更新:

“永远不要这样做,因为使用三元运算符来引用丢弃的变量只是为了避免连接,这绝对是一种恶劣的编码习惯!

【讨论】:

  • 啊,我知道有办法做到这一点。我是 PHP 新手,但变量替换似乎与 Bash 的实现相同。我知道你可以在 Bash 中做到这一点,我只是忘记了如何。
  • @Dunes,虽然这确实有效,但我不确定它是否值得您为可读性做出牺牲。如果您必须设置$default,您不妨在那里进行替换并将输出保留为echo "Hello $name";
  • 我没有投反对票,但我肯定会谴责任何坚持向我提交此代码而不仅仅是使用串联的人。您的答案至少应该包括“永远不要这样做,因为使用三元运算符来引用丢弃的变量变量只是为了避免连接,这绝对是一种恶劣的编码实践!”
  • @webbiedave - 我确实在 cmets 中添加了一条通知,指出这不是一种合适的做事方式。不过,我会更新我的答案以加强这一点。
  • @Col。弹片 - 问题是:“我想知道在 PHP 中是否可以使用以下内容。”好吧,这样的事情在 PHP 中是可能的。这是一个好主意与否无关紧要。是的,我应该添加一个说明,说明这不是是个好主意。但我确实回答了这个问题。
【解决方案2】:

实际上从来不需要。
学习使用模板。 HTML 应该是 HTML,而不是一些用 PHP 硬编码的抽象数据

<form action='add_demographics.php' method='post'>
   <table>
      <input type=hidden name=userId value='<?=_h($_SESSION['username'])?>'/>
      <tr><td>User ID:</td><td><?=_h($_SESSION['username'])?></td></tr>
<? foreach ($inputLabels as $i => $value): ?>
      <tr>
         <td><?=_h($value['text'])?></td>
         <td><select name="<?=$i?>">
<?   foreach ($value["options"] as $optionName => $optionValue): ?>
            <option value="<?=$optionValue?>" <? if ($result[$i]==$optionValue): ?> selected=true<? endif ?>>
              <?=$optionValue?>
            </option>
<?   endforeach ?>
          </select></td>
      </tr>
<? endforeach ?>
      <tr><td><input type='submit' name='submit' value='Submit' /></td></tr>
   </table>
</form>

【讨论】:

    【解决方案3】:
    <?
        function is($var,$sub){
          return isset($var)?$var:$sub;
        }
    
        echo 'Hello, '.is($name,'World').'!\r\n';
    
        $name = 'Bob';
    
        echo 'Hello, '.is($name,'World').'!\r\n';
    ?>
    

    也许是为了短手?

    【讨论】:

      【解决方案4】:

      考虑到你想做什么。我会说

      $string = isset($name) ? $name : 'World';
      $result = "Hello $string!\n";
      echo $result;
      

      【讨论】:

        【解决方案5】:

        不,不可能按照您的要求进行。

        但是,针对您的特定问题的解决方案可能是在 foreach 循环的顶部分配一个变量来保存是否应选择该选项,然后将该变量作为输出的一部分回显:

        foreach ($value["options"] as $optionName => $optionValue)
        {
            $selected = $result[$i] == $optionValue ? "selected='selected'" : "";
            echo "
                <option value=$optionValue $selected>$optionValue</option>";
        }
        

        【讨论】:

          【解决方案6】:

          不,不能那样做。您需要在字符串和连接之外执行此操作。 php 在字符串中唯一会做的事情是查找和评估单个 $var(无表达式) - 如果您使用双引号或等效的 heredoc(php 不会在单引号中评估 var)

          【讨论】:

          • 我想每个人都有自己的想法,但是...我不明白如何将表达式放在字符串中更具可读性...IMO它应该是分开的...更好的是,给出表达式它自己的行,然后在 echo 中使用 final 变量(在字符串内部或外部)。 IOW 将代码与内容分开。
          猜你喜欢
          • 2018-10-13
          • 2015-12-22
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 2013-07-13
          • 1970-01-01
          • 2014-12-15
          • 1970-01-01
          相关资源
          最近更新 更多