为何在Exception构造参数中调用print_r无法按预期工作?
为什么第一种写法里的print_r无法正常工作?
这个问题的核心在于PHP对双引号字符串的解析规则,咱们一步步拆解来看:
第一种写法的问题
你写的第一段代码是这样的:
throw new ExcepcionApi(BAD_URL, ("Bad URL: {print_r($peticion,TRUE)}"));
PHP在解析双引号包裹的字符串时,只会自动解析变量(比如这里的$peticion会被替换成它的字符串表示Array),但对于函数调用(比如print_r(...)),哪怕你把它放在花括号里,PHP也不会执行这个函数——它只会把整个{print_r(Array,TRUE)}当成普通字符串输出,这就是你在日志里看到奇怪内容的原因。
第二种写法为什么能正常运行
再看你的第二段代码:
$errorMsg=print_r($peticion,TRUE); throw new ExcepcionApi(BAD_URL, ("Bad URL: $errorMsg"));
这里你先手动执行了print_r($peticion, TRUE),把数组的格式化字符串结果存到了$errorMsg变量里。之后在双引号字符串中引用这个变量时,PHP会正常解析变量并替换成对应的内容,所以日志里能显示完整的数组结构。
额外小技巧:不用临时变量的写法
如果不想用临时变量,你可以用字符串拼接的方式直接把函数结果拼到字符串里,比如:
throw new ExcepcionApi(BAD_URL, "Bad URL: " . print_r($peticion, TRUE));
这种写法会先执行print_r得到结果,再和前面的字符串拼接,同样能达到你想要的效果。
内容的提问来源于stack exchange,提问作者A. Cedano
相关产品推荐
相关产品推荐

