PHP strlen函数在if语句中无法正常工作的原因排查
问题根源:运算符优先级与PHP类型转换的坑
嘿,这个问题其实是括号位置写错了,再加上PHP自动类型转换的特性,才导致了看似矛盾的结果,咱们一步步拆解清楚:
你的代码执行顺序完全不符合预期
你写的判断条件是:
if ( strlen( $year > 4 ))
它的执行逻辑是这样的:
- 第一步:先计算
$year > 4。当$year是字符串"2014"时,PHP会自动把字符串转为数字(因为要和数字做比较),2014显然大于4,所以这个表达式返回布尔值true。 - 第二步:把布尔值
true传给strlen()。在PHP里,布尔值转字符串时,true会变成"1",false会变成空字符串。所以strlen(true)的结果是1。 - 第三步:if判断的是
1,在PHP里非零的数字都会被视为true,所以条件成立,触发了return语句。
为什么return里的strlen($year)显示4?
因为return里的strlen($year)是直接对原字符串"2014"取长度,和条件里的错误计算完全无关,所以这里得到的是正确的长度4,这就造成了“条件说长度超了,但实际显示长度是4”的矛盾感。
正确的写法
把strlen($year)作为比较的主体,调整括号位置:
if ( strlen($year) > 4 ) { return "Position year must be a 4 digit year - The ".$year. " length is ".strlen($year); }
这样就能正确判断年份字符串的长度是否超过4了。
内容的提问来源于stack exchange,提问作者Mike Miller
相关产品推荐
相关产品推荐

