在PHP中声明多个变量的正确方式

64

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

我关闭错误显示的唯一原因是为了避免在使用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;
?>

3
期望 var $foo 是一个空字符串似乎有些奇怪。你后面要执行什么操作导致出现问题? - Mike B
2
我不太明白这是关于什么的。您在设置变量之前测试它,以检查是否可以设置它?您是从另一种语言过来的,例如“dim d as Integer”等需要设置变量吗?我认为您真正需要的是一些封装,例如函数、类等,这样就可以脱离全局命名空间,然后养成在每个函数/类方法的头部声明变量的习惯。 - Jared Farrish
关于error_reporting(0),它会禁用所有PHP错误。这是一种常见的安全实践,为了提高安全性而禁用错误。因此,在开发中除外(最好在私人环境或站点的某部分)。现在,在你交付的脚本中,这取决于你所交付的人的技能水平,所以你必须考虑他们可能不知道如何禁用它,但是应该在生产中禁用它。 - Jared Farrish
阅读此问题以获取有关错误报告的更多信息:https://dev59.com/zXVD5IYBdhLWcg3wI3-L - Mike B
@各位好 - 我应该这样声明全局变量吗 global $var1, $var2, $var3; ,然后返回值为 $var1,$var2,$var3;。 抱歉我没有在本地尝试过,只需要快速答复并获得额外的知识..所以在此发布..请别介意! - Neocortex
显示剩余12条评论
7个回答

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

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


14
若您想要仅仅"声明"它们,您可以使用分号将它们都放在同一行上,例如 $foo; $bar; $far; $boo;。请注意,对于初学者来说,$foo, $bar, $far, $boo; 会导致语法错误(解析错误),使脚本停止运行。请注意,翻译后的内容已经尽量保留了原意,同时更加通俗易懂。 - Jared Farrish
1
@JaredFarrish $foo; $bar; $far; $boo; 仍会抛出 Notice: Undefined variable: ... - Jeff Puckett
1
如果您只更改一个变量的值,这是否会使所有值都发生更改? - molerat
3
声明变量后,您可以单独更改每个变量的值,而它们各自保持自己的值。molerat和NO需要翻译时不需要修改,已经是英语单词。 - DaneSoul
@molerat,你也用Python编程吗?我刚开始学习Python编程,发现一个链中的更改会影响到其他所有部分。等一下,不是Python,是另一种语言。 - oldboy
能否将数组声明为相同的格式 $foo = $bar = $ping = $pong = [ ]; - ManojKiran A

14

我之前在评论中发布了这个问题,但有人建议我将其作为答案提交。

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

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

我通常更喜欢将事物设置为false,而不是空字符串,这样你总是可以使用 === false 进行检查,但这只是个人偏好,取决于你如何使用这些变量以及用途。


8
你使用 isset()if() 尝试是正确的方式!
但是你可以使用 三元运算符 来使代码更短/易读:
$foo = isset($foo) ? $foo : '';

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

自PHP 5.3以来,您甚至可以写得更短:

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

这将根据isset()返回的结果设置$fooTRUEFALSE,如评论中@Decent Dabbler所指。删除isset()将其设置为'',但也会抛出未定义变量通知(在生产环境中不会)。
自PHP 7以来,您可以使用null合并运算符:
$foo = $foo ?? '';

如果$foo存在且为空,则此代码不会引发任何错误,但它将被评估为TRUE,而不是使用简写三元运算符,后者将在变量为空时评估为FALSE

1
诚实的问题,为什么你想让$foo成为空字符串而不是null?我正在困惑中,试图想出一个这样的情况。 - Mike B
我相信提问者只是想设置一个默认值,这种情况下就是一个空字符串。请记住 '' != NULL 或未设置;-) - powtac
我不知道,我和@MikeB一样,我已经成为一个戒掉PHP开发者已经八年了,我从来没有系统地做过这样的事情,也没有因为不这样做而遇到问题? - Jared Farrish
6
$foo = isset($foo) ?: ''; 这行代码的实际效果可能与您预期的不同。如果 $foo 已经被设置了,它将会把 true 赋值给 $foo,而不管 $foo 最初的值是多少。请注意,这并不等同于给 $foo 赋一个空字符串的值。 - Decent Dabbler

5
一种稍微绕弯的方法是将变量名放入一个数组中,然后使用三元运算符循环它们,类似于powtac的答案。
$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar = '';

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

正如其他答案中提到的那样,自PHP 5.3版本以来,您可以将上述代码编写为以下形式:

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

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

请注意已更改的三元运算符。

2
在面向对象编程中,您可以使用以下方法:
protected $password, $full_name, $email;

对于非面向对象编程,你只需在代码中声明变量,如果你没有给它们赋值,那么它们将是未定义的:

$foo; $bar; $baz;

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

0

为什么不直接设置它们呢?

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

如果你想要保留它们的值,那么通常来说这是正确的方法。请注意,在你的语句中不需要第二对方括号:

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

就够了。


由于问题中使用了 isset,我认为 OP 意味着这些变量可能已经被赋值。 - Connor Deckers
2
如果你只是要设置它们,我会这样做:$foo = $bar = $ping = $pong = ''; - pocketfullofcheese
@pocketfullofcheese - 为什么不把那个作为一个(我知道是正确的)答案添加进去呢? - Jared Farrish
我应该这样做。感谢@JaredFarrish的建议。 - pocketfullofcheese

-3

解决问题的方法是

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

抛出异常

注意:未定义变量...

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

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


1
抑制错误/提示/警告并不等同于修复它们,应避免这种做法。 - treyBake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接