PHP stdClass赋值报错:本地文件运行失败但在线编译器正常
问题分析与解决
报错原因
你只实例化了顶层的$resp对象,但$resp->first_name、$resp->first_name->type_meta这些嵌套的子对象并未提前创建。当你直接尝试给$resp->first_name->type赋值时,$resp->first_name此时是null,无法对null的属性进行赋值操作,因此触发Attempt to assign property "type" on null的致命错误。
为什么w3schools能运行?
这是因为w3schools的PHP环境可能开启了特殊配置(比如allow_dynamic_properties)或做了兼容处理,自动为未定义的嵌套对象创建stdClass实例,但这并非PHP的标准行为,本地环境遵循PHP的严格规范,所以会报错。
修正后的代码
$resp = new stdClass(); // 先创建first_name子对象 $resp->first_name = new stdClass(); $resp->first_name->type = "select"; $resp->first_name->required = 'true'; // 创建first_name下的type_meta子对象 $resp->first_name->type_meta = new stdClass(); $resp->first_name->type_meta->options[0] = "opt 1"; $resp->first_name->type_meta->options[1] = "opt 2"; $resp->first_name->type_meta->options[2] = "opt 3"; // 创建last_name子对象 $resp->last_name = new stdClass(); $resp->last_name->type = "text"; $resp->last_name->required = 'true'; $resp->last_name->type_meta = new stdClass();
关键说明
PHP不会自动为你创建嵌套的stdClass对象,所有需要赋值属性的对象,都必须提前用new stdClass()显式实例化,这样才能保证代码在所有PHP环境中稳定运行,避免依赖特殊配置。
内容的提问来源于stack exchange,提问作者Muhammad Fahad
相关产品推荐
相关产品推荐

