【问题标题】:Testing variables in PHP在 PHP 中测试变量
【发布时间】:2011-09-21 14:11:00
【问题描述】:

今天早些时候我尝试这样做:

示例 1:

<?php 

  echo $myVar || "rawr";

?>

我认为这可能会打印出$myVar 如果它已设置,如果没有设置则打印"rawr"。 它打印了一个1,我认为这是OR 测试的结果。

然后我尝试的是这样的:

示例 2:

<?php
  if ($myVar)
  {
    echo $myVar;
  }
  else
  {
    echo "rawr";
  }
?>

这是我想要完成的。

我想我明白为什么第一个会打印OR 测试的结果而不是其中一个变量,以及我为什么尝试它 - 最近花了一些时间在 bash shell 上:)

谁能告诉我是否有办法执行示例 #2 中的文本,但语法与示例 #1 相似?

【问题讨论】:

  • PHP 在这里是出了名的不优雅。在大多数情况下,这是通过empty($var) ? "rawr" : $var 完成的。 SO上有gazillions of questions处理empty的这种用法。
  • 你的意思是像 echo (($myVar) ? $myVar : "rawr"); ?
  • @Jon - 坚持回答,我会标记为已接受,谢谢
  • @Jon "pup empty isset" 是吗? :P
  • @JonStirling:好吧,如果它只是$myVar,那么您应该已经在您第一次将它引入符号表时将其设置为 some 值。如果它是数组的索引(如$_GET),那么您可以将其隐藏在函数中。

标签: php logic


【解决方案1】:

PHP 5.3:

 echo $myVar ?: 'rawr';

5.3 之前:

 echo $myVar ? $myVar : 'rawr';

如果 $myVar 可能未设置,则您必须使用 isset($myVar) and $myVar 作为条件(这不适用于简写 ?: 语法,因为如果已设置,这将回显 1,而不是比值)。

 echo (isset($myVar) and $myVar) ? $myVar : 'rawr';

【讨论】:

    【解决方案2】:

    PHP 在这个部门是出了名的不优雅,而且真的没有很好的方法来做这个测试。

    作为一般解决方案,您需要使用三元运算符,如empty($var) ? "rawr" : $var。但是,在实践中,您会遇到以下两种情况之一:

    1.您自己的变量

    在这种你自己定义变量的情况下,最好的解决方案是在你定义它的地方给它一个已知的默认值(可能使用三元运算符)。

    2。数组内部

    如果数组不应该像超全局变量之一那样被触及,那么您可以将测试包装在一个函数中(几乎每个人都这样做)。

    如果数组在您的管辖范围内,但它来自外部来源,您可以使用“添加默认值”技巧:

    $incoming = array(...);
    $defaults = array("foo" => "bar");
    
    // Inject the defaults into $incoming without overwriting existing values
    $incoming += $defaults;
    

    此时您知道$defaults 中的每个键也存在于$incoming 中。

    【讨论】:

      【解决方案3】:

      在 PHP 5.3+ 中可以省略第二个参数:

      echo $myVar ?: 'rawr';
      

      这可能最接近你想要的。

      【讨论】:

        【解决方案4】:

        试试这个:

        echo $myVar = ($myVar) ? $myVar : 'rawr';
        

        echo $myVar ? $myVar : 'rawr';
        

        【讨论】:

          【解决方案5】:

          我想你想使用类似 var_dump($varname) 或 isset($varname) 的东西?

          【讨论】:

          • 不,我想测试一个变量,就像我在示例 2 中一样,但语法类似于示例 1。这可能不够清楚,我会更新问题
          【解决方案6】:

          这是运算符优先级的问题。你不能那样做。

          两点值得深思

          1. 如果未设置 $myVar,您将收到一条错误消息,而不是“wawr”;

          2. 当您要回显一些变量时,其中的每一个都应该被定义并具有价值。这将使您的模板干净易读。

          【讨论】:

          • 谢谢。在这种情况下,它将始终被设置,但它可能为空。 $myVar 来自数据库,如果没有行,我的任何代码都不会运行(或回显变量),但某些值允许为空。
          • 我只能说 - 在使用适当的值之前初始化所有变量。它会为您省去很多麻烦。您从其他答案中获得的所有这些技巧都是肮脏的
          • 再次感谢,但我真的不想在这里就最佳实践进行辩论。请放心,这不是我在实际页面上测试我的数据库输出的方式,我什至也对输入进行了清理:)
          【解决方案7】:

          试试 echo ($myVar != null ? $myVar : "Rawr!");

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-19
            • 2020-06-15
            • 1970-01-01
            • 1970-01-01
            • 2011-09-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多