在 PHP 中将字符串解析为布尔值

今天我在玩 PHP,我发现字符串值“ true”和“ false”在某种情况下没有被正确地解析为布尔值,例如考虑以下函数:

function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}

如果我执行:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

它似乎只适用于“1”和“0”值:

isBoolean("1") // Returns true
isBoolean("0") // Returns false

PHP 中是否有一个本机函数将“ true”和“ false”字符串解析为布尔值?

93453 次浏览

原因是,除了 "0"""(空字符串)之外,所有字符串在转换为布尔值时的计算结果都是 true

下面的函数将完全满足您的要求: 它的行为与 PHP 完全一样,但也将字符串 "false"计算为 false:

function isBoolean($value) {
if ($value && strtolower($value) !== "false") {
return true;
} else {
return false;
}
}

该文件解释说: http://php.net/manual/en/language.types.boolean.php:

当转换为布尔值时,下列值被认为是 FALSE:

  • 布尔错误本身
  • 整数0(零)
  • 浮点数0.0(零)
  • 空字符串和 字符串“0”
  • 零元素的数组
  • 特殊类型 NULL (包括未设置的变量)
  • 从空标记创建的 SimpleXML 对象

每个其他值都被认为是 TRUE (包括任何资源)。

在 PHP 中只有 "0"或空字符串强制为 false; 其他非空字符串强制为 true。来自 手动操作:

当转换为布尔值时,以下值被认为是 FALSE:

  • 空字符串和字符串“0”

您需要编写自己的函数来处理字符串 "true""false"。在这里,我假设其他所有内容都默认为 false:

function isBoolean($value) {
if ($value === "true") {
return true;
} else {
return false;
}
}

旁注,可以很容易地浓缩成

function isBoolean($value) {
return $value === "true";
}

PHP 中是否有一个函数将“ true”和“ false”字符串解析为布尔值?

不-两者都是字符串,而且这两者(如您所说的)的计算结果都是 true。在 PHP 中,只有空字符串的计算结果为 false

您需要手动进行测试。不过,如果可能的话,最好使用“真正的”布尔值。

我使用这个结构将字符串变形为布尔值,因为您希望其他大多数值使用 true:

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

有一种本地 PHP 方法可以做到这一点,它使用 PHP 的 filter _ var 方法:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

根据 PHP 手册:

对“1”、“ TRUE”、“ on”和“ yes”返回 TRUE。否则返回 FALSE。

如果设置了 FILTER _ NULL _ ON _ FAILURE,则仅对“0”、“ FALSE”、“ off”、“ no”和“”返回 FALSE,对于所有非布尔值返回 NULL。

我最近需要一个“松散”的布尔转换函数来处理类似您所询问的字符串(以及其他事情)。我发现了一些不同的方法,并提出了一个大型的测试数据集来运行它们.没有什么能满足我的需求,所以我写了自己的:

function loosely_cast_to_boolean($value) {
if(is_array($value) || $value instanceof Countable) {
return (boolean) count($value);
} else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
$value = (string) $value;
// see http://www.php.net/manual/en/filter.filters.validate.php#108218
// see https://bugs.php.net/bug.php?id=49510
$filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if(!is_null($filtered)) {
return $filtered;
} else {
// "none" gets special treatment to be consistent with ini file behavior.
// see documentation in php.ini for more information, in part it says:
// "An empty string can be denoted by simply not writing anything after
// the equal sign, or by using the None keyword".
if(strtolower($value) === 'none') {
$value = '';
}
return (boolean) $value;
}
} else {
return (boolean) $value;
}
}

注意,对于同时具有可数和字符串可施加性的对象,这将有利于计数而不是字符串值来确定真实性。也就是说,如果 $object instanceof Countable这将返回 (boolean) count($object),而不管 (string) $object的值是多少。

您可以看到我使用的测试数据的行为以及其他几个函数 给你的结果。从这个小 iframe 浏览结果有点困难,所以可以用 查看整个页面中的脚本输出代替(这个 URL 没有文档记录,所以这可能不会永远有效)。如果这些链接有一天死亡,我把密码贴在了粘贴剂上以及。

“应该是真的”和“不应该是真的”之间的界限非常武断; 我使用的数据是根据我的需要和审美偏好进行分类的,你的可能不同。

安全转换为布尔值的最简单方法;

    $flag = 'true';


if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
$flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
}


gettype($flag); // Would Return 'Boolean'
echo 'Val: '.$flag; // Would Output 'Val: 1'

如果您的 API 只接受字符串“ true”或“ false”, 使用 其他的都变成了 null,然后尝试:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

这假设 $input不是一个对象。 空合并(??)是在 PHP 7.0中引入的。