if( empty($foo) ){echo "variable is empty";} //виведе "variable is empty"
Отже потрібна додаткова перевірка функцією isset():
$foo = 1;
if( isset($foo) && !empty($foo) ){echo "variable = ".$foo;} //виведе "variable = 1"
Значення, які PHP empty() вважає порожніми, це:
NULL;
FALSE;
$string_1 = ";
echo strlen($string_1); //виведе 0
if( empty( $string_1 ) ){echo 'string_1 is empty';} //виведе "string_1 is empty"
$string_2 = '0';
echo strlen($string_2); //виведе 1
if( empty( $string_2 ) ){echo 'string_2 is empty';} //виведе "string_2 is empty"
Рядок ($string_2) довжиною в один символ з рядковим нулем ('0') функція empty() теж вважає марною.
Але рядок з одним пропуском не вважає марною:
$string_3 = ' ';
echo strlen($string_3); //виведе 1
if( empty( $string_3 ) ){echo 'string_3 is empty';} //нічого не виведе
Давайте розглянемо практичне застосування PHP empty і побачимо, як ця функція може привести до несподіваного результату.
Наприклад, ви розробляєте плагін для Wordpress, в якому за допомогою шорткодов будуть виводиться статті різних авторів. На сторінці вашого облікового запису кожного автора будуть показані його власні статті ("self") та статті інших авторів ("another") за останній місяць. З допомогою шорткода можна управляти кількістю виведення статей. За замовчуванням, якщо атрибути "self" і "another" не встановлені, будемо виводити, наприклад, 25 власних постів і 15 постів інших авторів.
[author_posts]
Щоб змінити значення, додамо інші кількості атрибути шорткода:
[author_posts self="10" another="5" ]
Подивимося, що в коді плагіна:
",
'another' => ",
),
$atts,
'author_posts'
);
if(!empty($atts['self'])){
echo $atts['self']." post(s)";
}else{
echo "25 self posts";}
if(!empty($atts['another'])){
echo $atts['another']." post(s)";
}else{
echo "15 posts of another authors";
}
}
add_shortcode( 'author_posts', 'posts_shortcode' );
Тут ми просто виводимо на друк дані, які користувач передав через шорткод. В результаті ми побачимо 10 власних постів і 5 - інших авторів.
Якщо ми не хочемо бачити, наприклад, пости інших авторів, то напишемо в шорткод "another=0", і посади інших авторів відображатися не будуть. Але ні! Функція PHP empty() вважає рядковий "0" як порожнє значення, і замість "0" постів інших авторів, відобразить значення за замовчуванням, тобто 15 записів замість нуля.
Іншими словами, ці дві аналогічні записи:
[author_posts another="0" ]
[author_posts ]
Щоб шорткод працював правильно, змінимо умову:
$is_null = (int)(-1);
'another' => $is_null,
if($atts['another']> -1 ){
echo $atts['another']." post(s)";
}else{
echo "15 posts of another authors";
}
Якщо атрибут "another" не вказано, то за замовчуванням нехай він дорівнює (-1). Тоді в умові будемо вважати, що атрибут задано, якщо він більше (-1).
Таким чином, цей шорткод:
[author_posts another="0" ]
тепер все правильно нам відображає, тобто за замовчуванням 25 статей автора (т. к. атрибут "self" не вказано) і жодної статті інших авторів.
Весь код:
",
'another' => $is_null,
),
$atts,
'author_posts'
);
if(!empty($atts['self'])){
echo $atts['self']." post(s)
";
}else{
echo "25 self posts
";}
if($atts['another']> -1 ){
echo $atts['another']." post(s)
";
}else{
echo "15 posts of another authors
";
}
}
add_shortcode( 'author_posts', 'posts_shortcode' );