Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:检查变量是否为字符串类型且不是空字符串?_Php_Performance_Micro Optimization - Fatal编程技术网

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

PHP:检查变量是否为字符串类型且不是空字符串?,php,performance,micro-optimization,Php,Performance,Micro Optimization,我需要检查传递的变量是否为字符串类型,并且它不是空的。我有以下功能: function isNonEmptyStr($var) { if(isset($var)) { if(is_string($var)) { if(strlen($var) > 0) { return true; } } } return false; } 我期望的结果是: echo(

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

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的字符串

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

如果你检查!如果字符串已为空,则将避免1次检查

这是一个简单的小基准测试脚本,您可以修改它,看看什么最有效。我只是尝试了一些相同的变化,第一个是最快的一小部分,但它们基本上都是一样的。对于你来说,没有更简单的方法来写它

<?php

$var = ' ';

if(!empty($var) && is_string($var)) {
    echo 'true';
} else {
    echo 'false';
}
另外,
$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');
  • 您不需要在函数内调用
    isset
    ,因为您正在测试函数签名中定义的变量。如果不将值传递到函数中,PHP将触发通知,这将解决问题
  • 您可以将整个内容内联:

    function isNonEmptyStr($var) {
        return is_string($var) && strlen($var) > 0;
    }
    
    这可能会稍微好一点或不好一点,但大多数情况下是读得更理智


  • 除此之外,没有更多的东西可以简化。如果您想精确地检查is string且不为空,那么这就是要执行的检查。如果你说你经常使用它,也许你需要接受PHP的动态类型特性,并更多地进行类型转换(要求你确切地知道什么时候可以转换成什么),或者,在进行验证时,您需要为数据设置较少的入口点,并且可以在整个应用程序中更多地依赖已完成的验证。

    要检查传递的变量是否为字符串类型,请使用函数
    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
    ?>
    
    <?php
        $str = '';
     
        var_dump(isset($str)); // true
    ?>
    
    请阅读以下内容:


    如果
    isset()
    ,您可以摆脱它,因为它总是由您的函数定义设置的。您可以使用
    !空($var)
    如果您已经知道它是一个字符串。如果您将它用于get和post vars,它们将始终是字符串。这不是更适合于代码检查吗?@johncode-实际上,如果您发送NULL,
    isset()
    将失败。但这与这个问题仍然无关如果他先检查
    是否为字符串()
    但它不是字符串,他可以避免1次检查。:)<代码>'0'
    被认为是空的
    @deceze如果'0'为空,函数应该返回truepassed@evilReiko但它不这样做,现在是吗!?这个函数是迄今为止最快的有效函数,它几乎比原来的快3倍!这是非常奇怪和可怕的,如果是字符串()之前放置!empty()函数运行速度明显较慢<代码>'0'被认为是空的。你是对的,你的问题实际上更糟。你让任何非空值通过<代码>新stdClass也将符合此代码中的“非空字符串”。@deceze感谢您的努力和解释。到目前为止,最快的函数是Flosculus提供的非空字符串1($val),尽管此函数与您的函数之间的差异非常小。如果$var是数组,则此函数会失败吗?或者我错过了什么?@Mirko定义“失败”…!?
    <?php
        $str = '';
     
        var_dump(isset($str)); // true
    ?>