Самый короткий способ присвоить значение по умолчанию переменной? - PullRequest
4 голосов
/ 21 сентября 2010

У меня сейчас есть право использовать значение cookie, если существует, в противном случае используйте значение по умолчанию:

$default_carat_min = "0.25";
if($_COOKIE["diamond-search_caratMin"])
{
    $default_carat_min = $_COOKIE["diamond-search_caratMin"];
}

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

Я пытался:

$default_carat_min = $_COOKIE["diamond-search_caratMin"] | "0.25";

Что не сработало.

Я могу сделать это:

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : "0.25";

Но мне не нравится, как я должен повторять $_COOKIE дважды. Мне интересно, есть ли способ написать что-то вроде моего второго примера?

Ответы [ 6 ]

20 голосов
/ 21 сентября 2010

В PHP 5.3 добавлено сокращение для троичного оператора :

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ?: "0.25";

, которое оценивает левую сторону, если левая сторона истинна, и оценивает правую сторону в противном случае.

Однако до версии 5.3 вам придется использовать длинную форму.

4 голосов
/ 21 сентября 2010

Вы можете использовать функцию:

function set_default(&$var, $default) {
    return isset($var) ? $var : $default;
}

$default_carat_min = set_default($_COOKIE["diamond-search_caratMin"], "0.25");
2 голосов
/ 21 сентября 2010

Я согласен с ответом Cfreak.Я бы предпочел, чтобы код был «очевидным».

Чтобы добавить к этому, хотя вы не хотите искать в своем коде каждый экземпляр 0.25 (или других значений), поэтому я рекомендую создатьфайл конфигурации, если у вас его нет, и добавьте его ...

DEFINE( 'DEFAULT_CARAT_MIN', 0.25 );
// other defaults

Затем включите файл конфигурации и

if($_COOKIE["diamond-search_caratMin"])
{
    $default_carat_min = $_COOKIE["diamond-search_caratMin"];
}
else {
    $default_carat_min = DEFAULT_CARAT_MIN;
}

, вы также можете использовать троичный оператор

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : DEFAULT_CARAT_MIN;
2 голосов
/ 21 сентября 2010

Я думаю, что вопрос субъективен.Я лично считаю, что лучше быть многословным, и в вашей первой форме нет ничего плохого, потому что совершенно очевидно, что делает ваш код.

Это не значит, что вы ограничены количеством строк или размером, которые вы можете использовать.Вы действительно экономите так много, сохраняя несколько нажатий клавиш?

Если это действительно проблема, возможно, попытка уменьшить количество переменных, которые вы используете в первую очередь, будет лучшим решением

1 голос
/ 03 декабря 2016

Чтобы избежать использования электронного уведомления:

$default_carat_min = @$_COOKIE["diamond-search_caratMin"] ?: "0.25";

Обратите внимание на использование @ для отключения сообщения об ошибке.

0 голосов
/ 08 сентября 2014

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

Вы можете сначала определить массив значений по умолчанию и удобно проходить через него. Этот пример просто проверяет глобальную переменную $ _COOKIE:

$defaults = Array(
    'diamond-search_caratMin' => "0.25"
    ,'diamond-search_caratMax' => "2.00"
);
foreach ($defaults as $dk => $dv) {
    if (!isset($_COOKIE[$dk])) {
        $_COOKIE[$dk] = $dv;
    }
}

Если вы планируете установить значения по умолчанию для нескольких переменных и разных типов, вы можете использовать следующий код:

$defaults = Array(
    '_COOKIE' => Array(
        'diamond-search_caratMin' => "0.25"
        , 'diamond-search_caratMax' => "2.00"
    )
    , 'myOtherArray' => Array(
        'value_1' => 10
        , 'value_2' => 20
    )
    , 'myString' => 'Hello'
    , 'myFloat' => 1.0
);
foreach ($defaults as $vk => $vv) {
    if (is_array($vv)) {
        if (!isset($$vk)) {
            $$vk = Array();
        }
        foreach ($vv as $dk => $dv) {
            if (!isset($$vk[$dk])) {
                $$vk[$dk] = $dv;
            }
        }
    } else {
        if(!isset($$vk)) {
            $$vk=$vv;
        }
    }
}

Следующим шагом будет создание массива $ defaults путем анализа некоторого ini-файла, чтобы вы могли легко централизовать свои значения по умолчанию в удобочитаемом и легко редактируемом виде. Я не собираюсь показывать это здесь, хотя я думаю, что это выходит за рамки того, о чем здесь спрашивали.

Надеюсь, кому-то это понравится ....

...