PHP:检查变量是否为字符串类型并且不是空字符串?

时间:2015-11-05 13:56:56

标签: php performance micro-optimization

我需要检查传递的变量是否是字符串的类型,并且它不是空的。我有以下功能:

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

  1. 您不需要在函数内部调用isset,因为您正在测试函数签名中定义的变量。如果你没有将值传递给函数,PHP将触发通知,这应该解决问题。
  2. 您可以内联整个内容:

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

    这可能是一个更高性能或更高性能,但大多数读取更合理。

  3. 除了这些要点之外,还有很多要简化的内容。如果你想完全检查是字符串并且不是空的,那么这是检查。如果你说你正在使用这个很多,也许你需要接受PHP的动态类型性质并输入更多的东西(要求你确切地知道什么时候可能会被投射到什么),或者您需要为进行验证的数据提供更少的入口点,并且可以更多地依赖于整个应用程序中的完成验证。

答案 2 :(得分:1)

要检查传递的变量是否为字符串类型,请使用函数 is_string($var)。请参见下面的示例:

<?php
    var_dump( is_string('hello') ); // true
    var_dump( is_string('') ); // true
    var_dump( is_string('5') ); // true
    var_dump( is_string('false') ); // true
?>

并检查它是否为空,您可以使用函数 isset() 参见下面的示例:

<?php
    $str = '';
 
    var_dump(isset($str)); // true
?>

阅读更多内容: How to check if a variable is a String in PHP?

How to check if a variable is undefined in PHP?

答案 3 :(得分:0)

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

如果你检查!empty之前它将避免检查is_string如果字符串已经为空,这将避免1次检查。

答案 4 :(得分:0)

<?php

$var = ' ';

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