Тест и эхо без повторения? - PullRequest
1 голос
/ 25 июля 2010

Это второстепенная вещь, но она меня давно беспокоит.Я ломал голову над тем, как написать такие заявления без повторения кода.Например:

echo isset($array[0])? $array[0]: 'not set';
$var = empty($other_var)? '$other_var not set': $other_var;

Есть ли какой-то оператор проверки и возврата (для первого) или оператора проверки и установки (для второго), о котором я не знаю?Это может показаться незначительным моментом, но дублирование кажется ненужным и может привести к очень длинным строкам, которые могут усложнить обслуживание.Подумайте:

$another_var = array_key_exists($array[Utility::FindIndex($username)][Constants::App_CRITERION], $haystack[NthDimension('my dimensional indicator')])? $array[Utility::FindIndex($username)][Constants::App_CRITERION], $haystack[NthDimension('my dimensional indicator')]: 'not set';

Да, да, приведенная выше строка полностью выдумана, но не исключено, что подобное может произойти.Мне просто кажется странным, что нет способа проверить что-то и присвоить его значение (если оно истинно) без повторения без повторения.

Ответы [ 2 ]

2 голосов
/ 25 июля 2010

Он не будет обрабатывать случай isset (), который является основным вариантом использования этого шаблона, но PHP 5.3 имеет краткую форму для троичного оператора.

$new_val = $if_true ? $if_true : $if_false;

можно сократить до

$new_val = $if_true ?: $if_false;

Странно, но я не смог найти его в документации, но вот вопрос по этому поводу: Что такое ?: в PHP 5.3?

2 голосов
/ 25 июля 2010

Я думаю, что в PHP 6 была запланирована функция с именем issetor или что-то подобное. Но я не могу вспомнить имя. И PHP 6 мертв в любом случае.

Итак, напишите себе:

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

echo issetor($_GET['me'], 'you');

Если вы хотите сделать его еще более абстрактным, посмотрите на это:

function isor(&$var, $default, $condition) {
    if (!is_callable($condition)) {
        throw new InvalidArgumentExpression('condition not callable!');
    }

    return $condition($var) ? $var : $default;
}

// this is equivalent to issetor($_GET['me'], 'you');
echo isor($_GET['me'], 'you', function(&$var) { return isset($var); });

// but you may use a more complicated thing here, too:
echo isor($_GET['me'], 'you', function($var) use($allowed) { return in_array($var, $allowed); });
// this is equivalent to:
echo in_array($_GET['me'], $allowed) ? $_GET['me'] : 'you';
// now the "normal" version is still shorter. But using isor allows you to store often used $condition closures in variables. For example, if you want to check if several values are in an array, you could write:
$isAllowed = function ($var) use ($allowed) {
    return in_array($var, $allowed);
};
$a = isor($a, 'default', $inAllowed);
$b = isor($b, 'default', $inAllowed);
$c = isor($c, 'default', $inAllowed);
$d = isor($d, 'default', $inAllowed);

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

function isor(&$var, $default, $condition, $addArgument = null) {
    if (!is_callable($condition)) {
        throw new InvalidArgumentExpression('condition not callable!');
    }

    return $condition($var, $addArgument) ? $var : $default;
}

// the above in_array condition:
echo isor($a, 'default', 'in_array', $allowed);
...