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
?>