【问题标题】:Proper way to declare multiple vars in PHP在 PHP 中声明多个变量的正确方法
【发布时间】:2012-06-17 00:33:03
【问题描述】:

多年来,我一直在使用 PHP 编写个人脚本,并且习惯于关闭错误显示。我即将发布其中一些脚本,并希望以正确的方式进行。

我关闭错误显示的唯一原因是避免在使用之前测试每个 var,这要归功于 isset()。

所以,这是我的问题:

有没有比这更好的方法来声明多个变量?

<?php
  // at the begining of my main file
  if (!isset($foo))  ($foo = '');
  if (!isset($bar))  ($bar = '');
  if (!isset($ping)) ($ping = '');
  if (!isset($pong)) ($pong = '');
  // etc. for every single var
?>

例如这样的事情:

<?php
  var $foo, $bar, $ping, $pong;
?>

【问题讨论】:

  • 期望var $foo 是一个空字符串似乎很奇怪。您稍后会执行哪些操作导致出现问题?
  • 我不太明白这是什么意思。您在设置之前测试变量以检查是否可以设置它?您是否来自另一种语言,您必须设置像dim d as Integer 这样的变量?我认为你真正需要的是一些封装,比如函数、类等,这样你就可以脱离全局命名空间,然后养成在每个函数/类方法的头部声明变量的习惯。
  • @MikeB:一个简单的测试。如果 var 没有首先声明,一个简单的if ($foo == 'blabla') 会提示错误。
  • 变量从哪里来?您是否使用 extract($_GET) 之类的东西来创建变量,而您实际上并不知道创建了什么?
  • 这个错误说明了什么?这是警告吗?

标签: php variables


【解决方案1】:

您的 if()isset() 尝试是这样做的正确方法!

但您可以使用Ternary Operator 将其写得更短/更易读:

$foo = isset($foo) ? $foo : '';

=之后的条件为真时,第一个$foo将设置为?之后的值,否则将设置为:之后的值。条件(在 =? 之间)将始终转换为布尔值。

从 PHP 5.3 你可以写得更短

$foo = isset($foo) ?: '';

这会将$foo 设置为TRUEFALSE(取决于isset() 返回的内容),正如@Decent Dabbler 在cmets 中指出的那样。删除 isset() 会将其设置为 '',但也会引发未定义变量通知(但不在生产环境中)。

从 PHP 7 开始,您可以使用空合并运算符:

$foo = $foo ?? '';

这不会引发任何错误,但如果$foo 存在并且为空,它将评估为TRUE,与速记三元运算符相反,如果变量为空,它将评估为FALSE

【讨论】:

  • 诚实的问题,为什么你想让$foo 是一个空字符串而不是null?我正在兜圈子,试图想出一个情况
  • 我确定提问者只是想设置一个默认值,在这种情况下是一个空字符串。并记住 '' != NULL 或未设置 ;-)
  • 我不知道,我和@MikeB 在一起,我已经是一名正在恢复中的 PHP 开发人员,工作了八年,我从来没有系统地做过这样的事情,或者遇到过不做的问题是吗?
  • $foo = isset($foo) ?: ''; 不会做你认为它会做的事。如果设置了$foo,则无论$foo的初始值如何,它都会将true分配给$foo
【解决方案2】:

这样做的一个有点迂回的方法是将变量的名称放在一个数组中,然后使用三元运算符循环它们,类似于powtac 的答案。

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar = '';

foreach($vars as $var)
{
    $$var = isset($$var) ? $$var : $defaultVar;
}

正如其他答案中提到的,从 5.3 版本开始,PHP 允许您将上述代码编写如下:

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar = '';

foreach($vars as $var)
{
    $$var = isset($$var) ?: $defaultVar;
}

注意更改后的三元运算符。

【讨论】:

    【解决方案3】:

    为什么不直接设置它们?

    <?php
    $foo = '';
    $bar = '';
    //etc
    ?>
    

    如果您想保留其中的价值,那么是的,这通常是正确的方法。请注意,您的语句中不需要第二对括号:

    if (!isset($foo)) $foo = '';
    

    够了。

    【讨论】:

    • 由于问题中的isset,我认为OP表明变量可能已经设置了一个值。
    • 如果你打算这样设置,我会这样做:$foo = $bar = $ping = $pong = '';
    • @pocketfullofcheese - 你为什么不把它添加为(我知道是正确的)答案?
    • 我想我应该有。感谢@JaredFarrish 的建议
    【解决方案4】:
    <?php
      $foo = $bar = $ping = $pong = '';
    ?>
    

    如果是你的脚本,并且你知道你在哪里使用了哪些变量,为什么还要花资源检查该变量之前是否声明过?

    【讨论】:

    • 另外,如果您出于某种原因只想“声明”它们,您可以将它们全部与; 放在一行中,就像在$foo; $bar; $far; $boo; 中一样,全部放在一行中。新手请注意,$foo, $bar, $far, $boo; 抛出(解析)语法错误,杀死脚本。
    • @JaredFarrish $foo; $bar; $far; $boo; 仍然会抛出 Notice: Undefined variable: ...
    • 如果只更改一个变量的值,这不会使所有值都改变吗?
    • molerat,不,在声明变量后,您可以单独更改它们,每个变量都将保留自己的值。
    • @molerat 你也用python编程,不是吗?我刚开始用python编程,发现改变链中的一个会改变所有其他的很难。实际上,等等,它不是 python。这是另一种语言
    【解决方案5】:

    我之前在评论中发布了此内容,但有人建议我将其作为答案提交。

    我能想到的最短最简单的方法是:

    $foo = $bar = $ping = $pong = '';
    

    我通常更喜欢将事物设置为 false,而不是空字符串,这样您以后总是可以使用 === false 进行检查,但这只是一种偏好,取决于您如何使用这些变量和为了什么。

    【讨论】:

      【解决方案6】:

      解决问题

        <?php
        $foo = $bar = $ping = $pong = '';
        ?>
      

      投掷

      注意:未定义的变量:...

        <?php
        @$foo = $bar = $ping = $pong = '';
        ?>
      

      它不会修复它,但它不会显示并且不会阻止脚本解析。

      【讨论】:

      • 抑制错误/通知/警告与修复它们不同,应该避免这种做法。
      【解决方案7】:

      在 OOP 中,您可以使用这种方法:

      protected $password, $full_name, $email;
      

      对于非 OOP,您只需在代码中声明它们,如果您没有为它们分配任何值,它们将是未定义的:

      $foo; $bar; $baz;
      
      $set_foo =  (isset($foo)) ? $foo : $foo = 'Foo';
      echo $set_foo;
      

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        相关资源
        最近更新 更多