Сидит у меня в РНР-коде такая “колбаса”, которая пытается выставить переменной $page значение - сначала из сессии, потом из хттп-переменной, ну и как дефолт единице:

// Set page number
if (isset($_SESSION['page']))
$page = $_SESSION['page'];
if (isset($attributes['page']))
$page = $attributes['page'];
if (!isset($page) || $page == '')
$page = 1;
Ничего не могу с собой поделать - мозолит глаза. Попробовал оптимизировать - код писал не я; подумал, как бы я сделал. Убрал последний предикат, дефолт поставил в начало, что логично.
// Set page number
$page = 1;
if (isset($_SESSION['page']))
$page = $_SESSION['page'];
if (isset($attributes['page']))
$page = $attributes['page'];
Всё равно колбаса, только короче. Ведь по сути выполняется почти одно и то же действие… Думай, Саша, думай. И придумал, вернее, вспомнил. В SQL такой код писать трудно, поэтому там есть функция COALESCE, которая возвращает значение того аргумента из переданных, который первым оказался не NULL:
SELECT COALESCE(NULL,1); – вернёт 1
Я решил применить тот же подход и для PHP. Вот что у меня получилось (я оставил оригинальную поддержку переменного числа аргументов):
//Returns the first non-empty value in the list
function coalesce()
{
for($i=0; $i < func_num_args(); $i++)
{
$arg = func_get_arg($i);
if(!empty($arg))
return $arg;
}
return “”;
}
В итоге, шестистрочная колбаса из начала поста превращается в нечто очень элегантное и удобное, т.к. парсится одним тактом процессора взглядом:
$page = coalesce($attributes['page'], $_SESSION['page'], 1); // Set page number
Хинт: в конец имеет смысл засунуть константу, чтобы переменная была проинициализированна в любом случае. Кстати, в ColdFusion есть удобный оператор, который одним вызовом реализует такой вот код:
if(!isset($var))
$var = $default_value;
Теперь мы тоже так можем:
$var = coalesce($var, $default_value);