在PHP中将stringparsing为布尔值
今天我在玩PHP,发现string值“true”和“false”在一个条件下没有被正确地parsing为布尔值,例如考虑下面的函数:
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中有一个本地函数来parsing“true”和“false”string为布尔值吗?
有一个使用PHP的filter_var方法的原生PHP方法:
$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);
根据PHP的手册:
对“1”,“true”,“on”和“yes”返回TRUE。 否则返回FALSE。
如果设置了FILTER_NULL_ON_FAILURE,则仅对“0”,“false”,“off”,“no”和“”返回FALSE,并且对于所有非布尔值返回NULL。
原因是所有string在转换为布尔值时都计算为true
,除了"0"
和""
(空string)。
以下函数将完全按照您的要求进行:它的行为与PHP完全相同,但也会将string"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:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空string和string“0”
- 具有零元素的数组
- 特殊types的NULL(包括未设置的variables)
- 由空标签创build的SimpleXML对象
其他每个值都被视为TRUE(包括任何资源)。
在PHP中只有"0"
或空string强制为false; 其他每个非空string都强制为true。 从手册 :
转换为布尔值时,以下值被认为是
FALSE
:
- 空string和string“0”
你需要编写你自己的函数来处理string"true"
与"false"
。 在这里,我假设一切都默认为false:
function isBoolean($value) { if ($value === "true") { return true; } else { return false; } }
在一个侧面说明,可以很容易地浓缩
function isBoolean($value) { return $value === "true"; }
我使用这个构造来将string变形为布尔值,因为对于大多数其他值,您需要true
:
$str = "true"; $bool = !in_array($str, array("false", "", "0", "no", "off"));
我最近需要一个“松散的”布尔转换函数来处理string,比如你正在询问的string(等等)。 我发现了一些不同的方法,并提出了一套大量的testing数据来贯穿它们 。 没有什么东西符合我的需要,所以我写了自己的:
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; } }
请注意,对于既可数又可串可转换的对象,这将有利于string值的计数以确定真实性。 也就是说,如果$object instanceof Countable
这个将会返回(boolean) count($object)
而不pipe(string) $object
的值。
您可以看到我使用的testing数据的行为以及其他几个函数的结果 。 这是很难从这个小iframe的结果,所以你可以查看脚本输出在一个完整的页面 ,而不是(该url是没有logging,所以这可能不会永远工作)。 如果这些链接有一天死了, 我也把代码放在pastebin上 。
什么“应该是真实的”和“不应该的”之间的界限是非常随意的。 我使用的数据是根据我的需求和美学偏好分类的,您可能会有所不同。
在PHP中有一个函数来parsing“true”和“false”string为布尔值吗?
没有 – 两个都是string,而这两者(就像你说的)评估为true
。 在PHP中,只有空string评估为false
。
你需要手动testing。 如果可能的话,最好使用“真正的”布尔值。
最简单的方法来安全地转换为布尔值;
$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'