编程语言
首页 > 编程语言> > PHP:检查变量是否为字符串类型并且不是空字符串?

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

功能正常.

我的问题:有没有办法在不影响结果的情况下提高功能性能?

我说的是“微优化”(我非常重视这个功能).

编辑:

对于那些要求的人:

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 ===”比空($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

标签:php,performance,micro-optimization
来源: https://codeday.me/bug/20190724/1526527.html