2015-11-05 2 views
0

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

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'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

+2

Вы можете избавиться, если 'isset()', поскольку он всегда задан определением вашей функции. –

+0

Может просто использовать '! Empty ($ var)', если вы уже знаете его строку. – Flosculus

+0

Если вы используете это для получения и публикации vars, они всегда будут строками. – AbraCadaver

ответ

2

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

Также $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, хотя разница между этой функцией и вашей очень мала – evilReiko

0
function isNonEmptyString($var){ 
    return !empty($var) && is_string($var); 
} 

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

+0

И если он сначала проверяет' is_string() 'и это не строка, он можно избежать 1 проверка. :) –

+0

'' 0'' считается 'пустым'. – deceze

+0

@deceze функция должна возвращать true, если '0' был пройден – evilReiko

-1
<?php 

$var = ' '; 

if(!empty($var) && is_string($var)) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 
+0

'' 0'' считается 'пустым'. – deceze

+0

Я просто попробовал его с «0» и получил правду https://3v4l.org/BeMbA – Fluinc

+1

Вы правы, ваша проблема на самом деле намного хуже. Вы пропускаете любое * не пустое значение * pass! 'new stdClass' также будет квалифицироваться как« непустая строка »в соответствии с этим кодом. – deceze

2
  1. Внутри функции не нужно вызывать isset, так как вы тестируете переменную, определенную в сигнатуре функции. Если вы не передадите значение в функцию, то PHP вызовет уведомления, которые должны позаботиться о проблеме.
  2. Вы можете встраивать всю вещь:

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

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

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

+0

Я узнал от вас что-то новое о 'isset()', спасибо! – evilReiko

+0

Это не удается, если $ var является массивом? Или я чего-то не хватает? – Mirko

+0

@Mirko Определить «не удается» ... !? – deceze

Смежные вопросы