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
- 您不需要在函数内部调用
isset
,因为您正在测试函数签名中定义的变量。如果您没有将值传递给函数 PHP 将触发通知,这应该会解决问题。
您可以内联整个内容:
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
?>
我需要检查传递的变量是否为字符串类型,并且不为空。我有以下功能:
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
- 您不需要在函数内部调用
isset
,因为您正在测试函数签名中定义的变量。如果您没有将值传递给函数 PHP 将触发通知,这应该会解决问题。 您可以内联整个内容:
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
?>