我需要检查传递的变量是否是字符串的类型,并且它不是空的。我有以下功能:
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
答案 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)
isset
,因为您正在测试函数签名中定义的变量。如果你没有将值传递给函数,PHP将触发通知,这应该解决问题。您可以内联整个内容:
function isNonEmptyStr($var) {
return is_string($var) && strlen($var) > 0;
}
这可能是一个更高性能或更高性能,但大多数读取更合理。
除了这些要点之外,还有很多要简化的内容。如果你想完全检查是字符串并且不是空的,那么这是检查。如果你说你正在使用这个很多,也许你需要接受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
?>
答案 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';
}