60

多年来,我一直在用 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;
?>
4

7 回答 7

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

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

于 2012-06-14T00:39:51.173 回答
12

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

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

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

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

于 2012-06-15T01:51:50.557 回答
8

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

但是您可以使用三元运算符将其写得更短/更具可读性:

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

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

从 PHP 5.3开始,你可以写得更短

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

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

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

$foo = $foo ?? '';

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

于 2012-06-14T00:32:20.053 回答
5

这样做的一种有点迂回的方法是,如果您将变量的名称放在一个数组中,然后使用三元运算符循环它们,类似于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;
}

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

于 2012-06-14T00:34:02.657 回答
2

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

protected $password, $full_name, $email;

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

$foo; $bar; $baz;

$set_foo =  (isset($foo)) ? $foo : $foo = 'Foo';
echo $set_foo;
于 2020-01-01T14:59:17.717 回答
0

为什么不直接设置它们?

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

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

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

足够的。

于 2012-06-14T00:34:23.397 回答
-3

To fix the issue of

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

throwing

Notice: Undefined variable: ...

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

It will not fix it but it will not be shown nd will not stop the script from parsing.

于 2016-09-29T04:18:34.557 回答