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

PHP: Check if variable is type of string AND is not empty string?

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

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

功能正常。

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

我说的是"micro optimization"(这个功能我用的很重)

编辑:

提问者:

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() 函数测试它会 return > 0

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

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

<?php

$var = ' ';

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

这是一个简单的小型基准测试脚本,您可以对其进行修改以查看最佳效果。我只是尝试了同一件事的几个变体,第一个是最快的,但它们基本上都是一样的。并没有真正更简单的方法来编写它。

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

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

    这可能会更高效一些,但主要是读起来更明智。

除了这几点,没有太多可以简化的了。如果你想做这个 is string and is not empty 的检查,那么这就是要做的检查。如果你说你使用这个 很多 ,也许你需要接受 PHP 的动态类型性质并更多地输入杂耍(要求你确切知道什么时候what might be cast to what though),或者您需要在进行验证的地方减少数据的入口点,并且可以更多地依赖您在整个应用程序中完成的验证。

要检查传递的变量是否为字符串类型,请使用函数 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?