Smarty4.3中访问关联数组元素触发500错误的问题咨询
问题核心
PHP端将关联数组赋值给Smarty变量user_info,直接输出{$user_info}能正常显示数组内容,但用{$user_info.okta_username}访问元素时触发PHP 8.1类型错误:Cannot access offset of type string on string,返回500状态码。
解决方法
强制转换变量类型
PHP 8.1类型检查严格,若$okta_user实际是对象(如StdClass)而非纯数组,Smarty点语法可能优先解析为对象属性导致出错。赋值时强制转为数组:$smarty->assign('user_info', (array)$okta_user);清理Smarty编译缓存
错误提示指向的编译文件(templates_c/ce629fe8ee999420d3ca3688e712adb8f5e4083e_0.file.myfile.tpl.php)大概率是旧缓存未更新——比如之前user_info曾被赋值为字符串,后续改数组但缓存没同步。直接删除templates_c目录下所有文件,让Smarty重新编译模板。改用数组下标语法
虽然官方支持点语法访问关联数组,但部分场景下下标语法更稳定:{$user_info['okta_username']}检查编译目录权限
若templates_c目录对PHP进程无读写权限,Smarty无法生成新编译文件,会一直使用旧的错误缓存,确保目录权限正确。
原因说明
直接输出{$user_info}时,Smarty会自动执行变量的字符串转换逻辑(如转JSON或打印结构),不会触发直接的元素访问;但使用点语法时,Smarty会生成直接访问元素的PHP代码,若编译缓存中的代码仍将user_info视为字符串,就会触发PHP 8.1的严格类型错误。
内容的提问来源于stack exchange,提问作者raphael75

