PHP: Проверьте, является ли переменная типом строки И не является ли пустой строкой?

1

Мне нужно проверить, является ли переданная переменная типом строки, и она не пуста. У меня есть следующая функция:

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

  • 2
    Вы можете избавиться, если isset() так как он всегда установлен вашим определением функции
  • 0
    Можно просто использовать !empty($var) если вы уже знаете, что это строка.
Показать ещё 5 комментариев
Теги:
performance
micro-optimization

4 ответа

5
Лучший ответ

Вот простой маленький скрипт сравнения, который вы можете изменить, чтобы увидеть, что лучше всего работает. Я просто попробовал несколько вариантов одного и того же, первый из них был самым быстрым с небольшим отрывом, но они в основном все одинаковы. И на самом деле нет более простого способа написать его.

Кроме того, $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
  • 0
    @deceze спасибо за ваши усилия и объяснения. Пока самая быстрая функция is_non_empty_string_1 ($ val) от Flosculus, хотя разница между этой и вашей функциями очень мала
2
  1. Вам не нужно вызывать isset внутри функции, так как вы тестируете переменную, которая определена в сигнатуре функции. Если вы не передадите значение в функцию, то PHP вызовет уведомления, которые должны позаботиться о проблеме.
  2. Вы можете встроить все это:

    function isNonEmptyStr($var) {
        return is_string($var) && strlen($var) > 0;
    }
    

    Это может быть немного более результативным или нет, но в основном читается гораздо более разумно.

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

  • 0
    Теперь я узнал от вас что-то новое о isset() , спасибо!
  • 0
    Это не удастся, если $ var является массивом? Или я что-то упустил?
Показать ещё 1 комментарий
0
function isNonEmptyString($var){
    return !empty($var) && is_string($var);
}

Если вы проверите! Пусто, прежде чем он избежит проверки is_string, если строка уже пуста, это позволит избежать проверки.

  • 0
    И если он is_string() проверяет is_string() и это не строка, он может избежать 1 проверки. :)
  • 1
    '0' считается empty .
Показать ещё 6 комментариев
0
<?php

$var = ' ';

if(!empty($var) && is_string($var)) {
    echo 'true';
} else {
    echo 'false';
}
  • 1
    '0' считается empty .
  • 0
    Я только что попробовал это с '0' и получил истинное 3v4l.org/BeMbA
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню