PHP中如何将字符串数组作为stdClass属性名预定义且无需即时赋值
问题解答
核心原因
- PHP中读取不存在的对象属性不会自动创建属性:你写的
$tmpUser->$head是属性读取操作,而非声明操作,此时如果属性不存在,仅会触发E_NOTICE级别的提示(默认配置下可能不会在页面输出),不会给对象新增对应属性。 - 只有赋值操作会触发自动属性创建:当你对对象的不存在属性执行赋值操作时,PHP才会自动为该stdClass对象新增一个公有的对应名称属性。
- 额外笔误:你初始定义的数组变量名为
$heading,循环时写的$headings多了一个s,这也是你第一段循环代码无法生效的原因之一。
为什么花括号写法不生效
$tmpUser->{$head}本质还是读取属性的逻辑,没有赋值操作就不会触发属性创建。$tmpUser->{'$head'}属于语法错误:单引号包裹的内容不会解析变量,你实际是在尝试访问名为$head的固定属性,而非变量$head存储的字符串值。
正确预定义空属性的实现方式
方案1:循环赋值为null
如果你需要显式预定义所有属性,默认值设为null即可:
$heading = ["cgonboardingid","username","firstname","lastname","departement","lang","cgrole"]; $tmpUser = new \stdClass(); foreach ($heading as $head) { $tmpUser->$head = null; }
方案2:数组转对象(更简便)
直接用array_fill_keys生成关联数组后强制转为stdClass,一行代码即可完成:
$heading = ["cgonboardingid","username","firstname","lastname","departement","lang","cgrole"]; $tmpUser = (object) array_fill_keys($heading, null);
内容的提问来源于stack exchange,提问作者JahStation
相关产品推荐
相关产品推荐

