Мне нужно проверить, является ли переданная переменная типом строки, и она не пуста. У меня есть следующая функция:
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
Функция работает нормально.
Мой вопрос: есть ли способ улучшить производительность функции без эффекта?
Я говорю о "микро оптимизации" (я очень сильно использую эту функцию).
EDIT:
Для тех, кто спрашивает:
echo(isNonEmptyStr(0));// should return false, because it not a string
echo(isNonEmptyStr(1));// should return false, because it not a string
echo(isNonEmptyStr('0'));// should return true, because it a non-empty string
echo(isNonEmptyStr('1'));// should return true, because it 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, либо больше манипулировать им (требуется, чтобы вы точно знали, что может быть применено к чему), или вам нужно иметь меньше точек входа для ваших данных, где вы выполняете валидацию, и можете больше полагаться на свою проделанную проверку во всем приложении.
isset()
, спасибо!
function isNonEmptyString($var){
return !empty($var) && is_string($var);
}
Если вы проверите! Пусто, прежде чем он избежит проверки is_string, если строка уже пуста, это позволит избежать проверки.
is_string()
проверяет is_string()
и это не строка, он может избежать 1 проверки. :)
'0'
считается empty
.
<?php
$var = ' ';
if(!empty($var) && is_string($var)) {
echo 'true';
} else {
echo 'false';
}
'0'
считается empty
.
isset()
так как он всегда установлен вашим определением функции!empty($var)
если вы уже знаете, что это строка.