PHP奇怪undefined index错误如何通过类型声明解决?
PHP奇怪的"undefined index"报错解决方案
我遇到了一个非常奇怪的undefined index错误,特意分享解决方案,避免其他开发者也为此耗费大量时间。
核心解法
给传入函数的参数做类型转换,即可保证返回的数组在字符串中拼接使用时,不会触发"undefined index"错误。
问题复现
代码从URL中获取参数$params,将其传入函数得到一个大数组,之后尝试将数组的某个元素拼接入字符串。
$wid = $params[2] ?? null; // 从URL参数中获取id $wk = \Workshops\get_workshop_info($wid); // 获取大数组 if (isset($wk['title'])) { $message = "本次工作坊的标题是:{$wk['title']}"; // 无告警 } $message = "本次工作坊的标题是:{$wk['title']}"; // 报undefined index? print_r($wk);
当我在isset判断语句外尝试将$wk['title']拼入字符串时,触发了"undefined index"错误。但print_r($wk)的输出明确显示'title'索引存在且有对应值(已隐去数组中包含用户邮箱的敏感内容)。
Array ( [id] => 425 [title] => 短剧写作 [start] => 2021-11-07 17:00:00 [end] => 2021-11-07 19:30:00 [cost] => 225 [capacity] => 8 [notes] => 这是WGIS新开的短剧写作课程,面向进阶短剧学习者和纯新手开放。如果你是有经验的创作者,可以来打磨你的写作技巧,学习新的短剧创作手法、风格和表达形式。如果你是完全零基础的新人,也可以来学习如何把你脑子里有趣的点子变成可上台、可拍摄、可表演的完整短剧。非常适合想要转型写作的即兴表演学生。无论你是什么背景,课程都会聚焦于你个人的表达风格,把你觉得有意思的内容变成优秀的剧本。这是一门实践性极强的写作课,五周课程结束后你至少能完成两个完整的短剧脚本。 [location_id] => 8 [sold_out_late] => -1 [when_public] => 1969-12-31 16:00:00 [teacher_id] => 8 [co_teacher_id] => [reminder_sent] => 0 [application] => 0 [address] => [city] => [state] => [zip] => [place] => 线上 [lwhere] => [soldout] => 0 [showstart] => 11月7日周日 17:00(太平洋夏令时) [showend] => 19:30(太平洋夏令时) [when] => 11月7日周日 17:00-19:30(太平洋夏令时) [short_title] => 短剧写作 [costdisplay] => 225美元 [total_class_sessions] => 5 [total_show_sessions] => 0 [total_sessions] => 5 [time_summary] => 5次课 [full_when] => 11月7日周日 17:00-19:30(太平洋夏令时)<br> 11月14日周日 17:00-19:30(太平洋夏令时)<br> 11月21日周日 17:00-19:30(太平洋夏令时)<br> 11月28日周日 17:00-19:30(太平洋夏令时)<br> 12月5日周日 17:00-19:30(太平洋夏令时)<br> [upcoming] => 1 [actual_revenue] => 0 [enrolled] => 5 [waiting] => 0 [dropped] => 0 [applied] => 0 [paid] => 0 [open] => 3 )
最终解决方案
只需要将传入函数的参数显式转换为int类型,就彻底解决了所有问题:
$wid = (int) ($params[2] ?? 0); $wk = \Workshops\get_workshop_info($wid); // 获取大数组
问题根源
PHP默认将参数$wid识别为字符串类型,但get_workshop_info()函数默认接收int类型参数,由于没有给get_workshop_info()添加参数类型声明,所以没有直接抛出报错,但传入字符串类型参数后返回的数组在后续使用时就会触发undefined index错误。
经历这次问题后,我给所有函数的参数都加上了类型声明。这段代码出自我手写的大型MVC项目,由于可能出问题的环节太多,我一开始甚至没打算向外求助。
内容的提问来源于stack exchange,提问作者Will Hines
相关产品推荐
相关产品推荐

