Мне нужно проверить, является ли переданная переменная типом строки и не является ли она пустой. У меня есть следующая функция:
function isNonEmptyStr($var)
{
if(isset($var)) {
if(is_string($var)) {
if(strlen($var) > 0) {
return true;
}
}
}
return false;
}
ожидаемых результатов:
echo(isNonEmptyStr(''));// false
echo(isNonEmptyStr(' '));// true
echo(isNonEmptyStr('a'));// true
echo(isNonEmptyStr('1'));// true
echo(isNonEmptyStr(1));// false
echo(isNonEmptyStr(0));// false
echo(isNonEmptyStr(0.0));// false
echo(isNonEmptyStr(0.1));// false
echo(isNonEmptyStr(array()));// false
echo(isNonEmptyStr(new myObj()));// false
echo(isNonEmptyStr(true));// false
echo(isNonEmptyStr(false));// false
echo(isNonEmptyStr(null));// false
Функция работает отлично.
Мой вопрос: есть ли способ улучшить производительность функции, не влияя на результаты?
Я говорю о «микрооптимизации» (я очень активно использую эту функцию).
РЕДАКТИРОВАТЬ:
Для тех, кто спрашивает:
echo(isNonEmptyStr(0));// should return false, because it's not a string
echo(isNonEmptyStr(1));// should return false, because it's not a string
echo(isNonEmptyStr('0'));// should return true, because it's a non-empty string
echo(isNonEmptyStr('1'));// should return true, because it's a non-empty string
Замечания: непустая строка = строка, которая при тестировании с функцией strlen () вернет> 0
Вот простой маленький скрипт тестирования, который вы можете изменить, чтобы увидеть, что работает лучше всего. Я только что попробовал несколько вариантов одной и той же вещи, первая самая быстрая с небольшим отрывом, но они в основном все одинаковые. И нет более простого способа написать это.
Также $val === ''
немного быстрее чем empty($val)
в дополнение к тому, чтобы быть более точным для вас.
Кроме того, так как это в основном один вкладыш, почему бы просто не сократить накладные расходы, сделать его функцией и вызвать is_string($val) && $val !== ''
непосредственно. Это не имеет большого значения, но это заметно для миллионов итераций, но я сомневаюсь, что эта процедура станет основным узким местом в любом вашем коде …
function is_non_empty_string_1($val)
{
return is_string($val) && $val !== '';
}
function is_non_empty_string_2($val)
{
return gettype($val) === 'string' && $val !== '';
}
function is_non_empty_string_3($val)
{
switch (true) {
case !is_string($val): return false;
case $val === '': return false;
}
return true;
}
$values = array('', '1', new stdClass(), 1, 2, 3, 999, array(), array());
$runs = 2000000;
function benchmark($test, $values, $runs, $func)
{
$time = time();
for ($i = 0; $i < $runs; $i++) {
foreach ($values as $v) {
$func($v);
}
}
echo $test . '. ' . (time() - $time) . PHP_EOL;
}
benchmark(1, $values, $runs, 'is_non_empty_string_1');
benchmark(2, $values, $runs, 'is_non_empty_string_2');
benchmark(3, $values, $runs, 'is_non_empty_string_3');
Результаты:
1. 5
2. 6
3. 6
isset
внутри функции, так как вы тестируете переменную, которая определена в сигнатуре функции. Если вы не передадите значение в функцию, PHP вызовет уведомления, которые должны решить проблему.Вы можете включить все это:
function isNonEmptyStr($var) {
return is_string($var) && strlen($var) > 0;
}
Это может быть немного более производительным или нет, но в основном это читается более разумно.
Помимо этих моментов, здесь не так много упрощений. Если вы хотите сделать именно эту проверку является строкой и не является пустым, тогда это проверка, чтобы сделать. Если вы говорите, что используете это много, возможно, вам нужно либо принять динамически типизированную природу PHP и больше жонглировать типами (требуется, чтобы вы точно знали, когда что может быть приведено к чему бы то ни было), либо вам нужно иметь меньше точек входа для ваших данных, где вы проводите проверку и можете полагаться подробнее о выполненной проверке в приложении.
function isNonEmptyString($var){
return !empty($var) && is_string($var);
}
Если вы проверите! Empty до того, как он будет избегать проверки is_string, если строка уже пуста, это позволит избежать 1 проверки.
<?php
$var = ' ';
if(!empty($var) && is_string($var)) {
echo 'true';
} else {
echo 'false';
}