it-swarm.com.ru

Правильный способ объявить несколько переменных в PHP

Я годами кодирую личные сценарии в 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;
?>
45
Tom Biakryek
<?php
  $foo = $bar = $ping = $pong = '';
?>

Если это ваш сценарий, и вы знаете, какие переменные вы используете, зачем вам тратить ресурсы, чтобы проверить, была ли переменная объявлена ​​раньше?

77
DaneSoul

Я разместил это в комментарии ранее, но кто-то предложил мне представить это как ответ.

Самый короткий и простой способ, который я могу придумать, это сделать: 

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

Я часто предпочитаю устанавливать значение false вместо пустой строки, чтобы вы всегда могли делать проверки в будущем с помощью === false, но это всего лишь предпочтение и зависит от того, как вы используете эти переменные и для чего.

11
pocketfullofcheese

Ваша попытка if() с isset() является правильным способом сделать это!

Но вы можете написать это немного короче/более читабельно, используя Ternary Operator :

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

Первый $foo будет установлен в значение после ?, когда условие после = будет истинным, в противном случае он будет установлен в значение после :. Условие (между = и ?) всегда будет приведено как логическое. 

Начиная с PHP 5.3 вы можете написать это еще короче:

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

Это установит $foo в TRUE или FALSE (в зависимости от того, что возвращает isset()), как указано @Decent Dabbler в комментариях. При удалении isset() будет установлено '', но также будет выдано уведомление о неопределенной переменной (но не в производстве).

Начиная с PHP 7 вы можете использовать пустой оператор объединения:

$foo = $foo ?? '';

Это не выдаст никакой ошибки, но будет оцениваться как TRUE, если $foo существует и будет пустым, в отличие от сокращенного тернарного оператора, который будет оцениваться как FALSE, если переменная пуста.

8
powtac

Несколько приблизительный способ сделать это, если вы поместите имя ваших переменных в массив, а затем зациклите их с помощью тернарного оператора, аналогично ответу 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;
}

Обратите внимание на измененный троичный оператор.

5
Connor Deckers

Почему бы просто не установить их?

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

Если вы пытаетесь сохранить значение в них, то да, это в общем-то правильный путь. Обратите внимание, что вам не нужна вторая пара скобок в ваших утверждениях:

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

достаточно.

0
jli

Чтобы исправить проблему 

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

бросание 

Примечание: неопределенная переменная: ...

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

Это не исправит это, но не будет показано и не остановит синтаксический анализ сценария.

0
c0d3x1337