Nano Hash - криптовалюты, майнинг, программирование

Правильный способ объявления нескольких переменных в 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;
?>
14.06.2012

  • Ожидать, что var $foo будет пустой строкой, кажется странным. Какие операции вы выполняете позже, вызывая проблемы? 14.06.2012
  • Я не совсем понимаю, о чем идет речь. Вы тестируете переменную перед тем, как установить, чтобы проверить, можно ли ее установить? Вы переходите с другого языка, где вам нужно установить такие переменные, как dim d as Integer? Я думаю, что вам действительно нужна некоторая инкапсуляция, такая как функции, классы и т. Д., Чтобы вы вышли из глобального пространства имен, а затем приобрели привычку объявлять переменные во главе каждой функции / метода класса. 14.06.2012
  • @MikeB: простой тест. Если переменная не объявлена ​​в первую очередь, простой if ($foo == 'blabla') вызовет ошибку. 14.06.2012
  • Откуда тогда берутся переменные? Вы используете что-то вроде extract($_GET) для создания переменных и на самом деле не знаете, что было создано? 14.06.2012
  • Что говорит эта ошибка? Это предупреждение? 14.06.2012
  • @JaredFarrish <?php echo $foo; произведет PHP Notice: Undefined variable: $foo 14.06.2012
  • @JaredFarrish: дело в том, что мне там не нужны функции. Единственная причина, по которой я хотел бы протестировать эти вары, - это избежать отображения ошибки на серверах, где отчеты об ошибках не отключены. Скрипт работает как есть (не отображает ошибок, связанных с php, и не является слабым с точки зрения безопасности). 14.06.2012
  • @JaredFarrish да, это всего лишь предупреждение (извините, если было непонятно) 14.06.2012
  • Затем оставьте это людям, выполняющим сценарий, или (если они не разбираются) поставьте error_reporting(0). Уведомление не является чем-то, что приправляет ваш код легкомысленными проверками, и вы все равно должны использовать функции, по крайней мере, чтобы вы не находились в глобальном пространстве имен (что, как я думал, вы можете быть обеспокоены). Это просто хорошая практика - каким-то образом инкапсулировать ваш код. Если вы действительно беспокоитесь, просто объявите свои переменные, которые вы использовали, во главе скрипта. Никаких проверок не требуется, и многие считают это хорошей практикой самодокументирования. 14.06.2012
  • E_NOTICE - уведомления во время выполнения. Укажите, что сценарий обнаружил что-то, что может указывать на ошибку, но может также произойти при обычном выполнении сценария. 14.06.2012
  • Уведомление не является чем-то, что могло бы усыпить вас легкомысленными проверками. Спасибо за ваш ответ, на самом деле я беспокоился о том, что это считается плохой практикой, когда для error_reporting устанавливается значение 0 ?. Теперь у меня есть ответ. У вас есть ссылки по инкапсуляции кода? Как указывалось ранее, на сегодняшний день я использую функции или классы только тогда, когда это абсолютно необходимо. Поскольку я самоучка, мне очень интересны любые лекции, которые могут улучшить мои навыки. 14.06.2012
  • @TomBiakryek Нет, нет, неправильный вывод: p - Проверка ошибок, безусловно, хорошая вещь. Многие выступают за то, чтобы отчеты об ошибках устанавливались на строжайшем уровне во время разработки (и, конечно, не в производственной среде). Ваши намерения в этом вопросе - очень хорошая практика. Мне просто было любопытно узнать о ваших конкретных обстоятельствах. 14.06.2012
  • Что касается error_reporting(0), который отключает все ошибки PHP, это общепринятая практика безопасности - принудительное отключение ошибок в целях безопасности. Так что использовать его, да, кроме как в разработке (и желательно в частной среде или части вашего сайта). Теперь, в сценарии, который вы передаете, это зависит от уровня навыков человека, которому вы его передаете, поэтому вы должны учитывать, что они могут не знать, как это сделать, но должны отключить его в производственной среде. 14.06.2012
  • Прочтите этот вопрос для получения дополнительной информации об отчетах об ошибках stackoverflow.com/questions/74847/ 14.06.2012
  • Что касается инкапсуляции, см. Какова цель инкапсуляции? Что такое инкапсуляция с простым примером в php? На самом деле нет любое действительно необходимое время для методов инкапсуляции, это просто о том, чтобы оно соответствовало требованиям вашего кода. Например, некоторые языки являются почти полностью функциональными или объектно-ориентированными. PHP дает вам оба мира, поэтому постарайтесь использовать их как можно больше. ;) 14.06.2012
  • @MikeB @JaredFarrish Я очень благодарен за вашу помощь. Еще раз спасибо! :) 14.06.2012
  • Похоже, это неплохой пример: Инкапсуляция в PHP 14.06.2012
  • @TomBiakryek, ты должен принять ответ ... 29.07.2012
  • @Helloall - Должен я объявить вот так global $var1, $var2, $var3; и return $var1, $var2, $var3;. Извините, не пробовал на местном уровне, просто нужен был быстрый ответ с дополнительными знаниями ... Так что разместите здесь ... пожалуйста, не возражайте! 24.12.2013

Ответы:


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

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

14.06.2012
  • Кроме того, если вы по какой-то причине хотите просто объявить их, вы можете поместить их все в одну строку с ;, как в $foo; $bar; $far; $boo;, все в одной строке. Примечание для непосвященных: $foo, $bar, $far, $boo; выдает синтаксическую ошибку (синтаксического анализа), убивая сценарий. 14.06.2012
  • @JaredFarrish $foo; $bar; $far; $boo; все равно бросит Notice: Undefined variable: ... 19.07.2016
  • Не приведет ли это к изменению всех значений, если вы измените значение только одной переменной? 13.07.2018
  • молерат, НЕТ, после того, как переменные объявлены, вы можете изменить их по отдельности, и каждая из них сохранит свое значение. 14.07.2018
  • @molerat вы тоже программируете на питоне, не так ли ?? Я только начал программировать на Python и на собственном опыте выяснил, что изменение одного в цепочке меняет все остальные. на самом деле, подождите, это был не питон. это был другой язык 12.11.2018
  • можно ли объявить массив в том же формате $foo = $bar = $ping = $pong = [ ]; 01.04.2019

  • 2

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

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

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

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

    15.06.2012

    3

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

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

    $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, если переменная пуста.

    14.06.2012
  • Честный вопрос, почему вы хотите, чтобы $foo была пустой строкой по сравнению с нулем? Я хожу по кругу, пытаясь придумать обстоятельства 14.06.2012
  • Я уверен, что спрашивающий просто хочет установить значение по умолчанию, в данном случае пустую строку. И имейте в виду: ''! = NULL или не установлено ;-) 14.06.2012
  • Я не знаю, я с @MikeB, я занимаюсь выздоравливающим PHP-разработчиком восемь лет, и я никогда систематически не делал ничего подобного, или у меня была проблема, что не делал этого? 14.06.2012
  • $foo = isset($foo) ?: ''; не будет делать то, что вы думаете. Если установлен $foo, он присвоит true $foo независимо от начального значения $foo. 14.06.2012

  • 4

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

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

    14.06.2012

    5

    В ООП можно использовать такой подход:

    protected $password, $full_name, $email;
    

    Для не-ООП вы объявляете их просто в коде, они будут Undefined, если вы не присвоили им никакого значения:

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

    6

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

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

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

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

    достаточно.

    14.06.2012
  • Из-за isset в вопросе я думаю, что OP указывает, что существует вероятность того, что переменные уже могут иметь значение, установленное для них. 14.06.2012
  • если бы вы собирались просто установить тогда, я бы сделал: $ foo = $ bar = $ ping = $ pong = ''; 14.06.2012
  • @pocketfullofcheese - Почему бы вам не добавить это в качестве (насколько я знаю, правильного) ответа? 14.06.2012
  • Я полагал, что должен был. Спасибо @JaredFarrish за предложение 15.06.2012

  • 7

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

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

    бросание

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

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

    Это не исправит, но не будет отображаться и не остановит анализ скрипта.

    29.09.2016
  • подавление ошибок / уведомлений / предупреждений - это не то же самое, что их исправление, и этой практики следует избегать. 21.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..