PHP函数传值咨询:foo函数返回值逻辑疑问
分析PHP的foo函数逻辑与返回值疑惑解答
首先先把你的代码整理成可读性更好的格式:
function foo($bar) { $qux = strpos('abcdef', $bar); if ($qux) { $qux += 1; } else { $qux = -1; } return $qux; } $x = foo('abc'); $y = foo('def');
接下来我一步步拆解这个函数的执行逻辑,帮你理清疑惑:
1. 核心函数strpos的返回值是关键
你提到了PHP里布尔值true对应1、false对应0,但这里要注意:strpos返回的不是布尔值,而是子串在目标字符串中的起始索引(从0开始计数),只有当子串完全找不到时才返回false。
举个例子:
- 当调用
foo('abc')时,'abc'是'abcdef'的开头,起始索引是0,所以$qux = 0 - 当调用
foo('def')时,'def'从索引3开始(a=0, b=1, c=2, d=3),所以$qux = 3
2. if ($qux)的判断逻辑陷阱
PHP是弱类型语言,在条件判断里会自动转换类型:
- 数字0会被当作
false处理 - 任何非0的数字(比如3)会被当作
true处理
所以对应两次调用的分支走向:
- 对于
$qux=0(调用'abc'的情况):if ($qux)条件不成立,进入else分支,把$qux赋值为-1,最终$x = -1 - 对于
$qux=3(调用'def'的情况):if ($qux)条件成立,执行$qux +=1,变成4,最终$y =4
3. 额外补充:正确判断子串是否存在的写法
这个函数的逻辑其实存在一个常见误区:如果子串刚好从索引0开始,会被误判为“没找到”。如果要避免这个问题,应该用**严格不等于!==**来判断,因为它会同时比较值和类型,能区分0和false:
function foo($bar) { $qux = strpos('abcdef', $bar); if ($qux !== false) { // 严格判断是否找到子串 $qux += 1; } else { $qux = -1; } return $qux; }
这样调用foo('abc')时,$qux会变成0+1=1,才是符合预期的“找到子串后索引+1”的逻辑。
内容的提问来源于stack exchange,提问作者Giant
相关产品推荐
相关产品推荐

