如何在PHP> = 5.3严格模式下向对象添加属性而不生成错误

Ray*_*Ray 67 php class

这必须简单,但我似乎无法找到答案....

我有一个$foo没有属性的通用stdClass对象.我想为它添加一个$bar尚未定义的新属性.如果我这样做:

$foo = new StdClass();
$foo->bar = '1234';
Run Code Online (Sandbox Code Playgroud)

PHP在严格模式下抱怨.

在已经实例化的对象中添加属性的正确方法(在类声明之外)是什么?

注意:我希望该解决方案与stdClass类型的通用PHP对象一起使用.

关于这个问题的一点背景.我正在解码一个json字符串,它是一个json对象数组. json_decode()生成一个StdClass对象数组.我需要操纵这些对象并为每个对象添加属性.

Cro*_*tab 105

如果你绝对必须将属性添加到对象,我相信你可以把它作为一个数组,添加你的属性(作为一个新的数组键),然后将其作为一个对象强制转换.你遇到stdClass对象的唯一一次(我相信)就是当你把一个数组作为一个对象或者你stdClass从头开始创建一个新对象时(当然还有json_decode()什么东西 - 愚蠢的我忘了!).

代替:

$foo = new StdClass();
$foo->bar = '1234';
Run Code Online (Sandbox Code Playgroud)

你做的:

$foo = array('bar' => '1234');
$foo = (object)$foo;
Run Code Online (Sandbox Code Playgroud)

或者,如果您已有一个现有的stdClass对象:

$foo = (array)$foo;
$foo['bar'] = '1234';
$foo = (object)$foo;
Run Code Online (Sandbox Code Playgroud)

也作为1班轮:

$foo = (object) array_merge( (array)$foo, array( 'bar' => '1234' ) );
Run Code Online (Sandbox Code Playgroud)

  • 你的解决方案有效,但它伤害了我的OO心脏:)希望某种类型的华丽反射kung foo或者其他东西......要保持问题的开放时间更长一些,并希望得到一些鲜为人知的PHP魔法. (2认同)

小智 78

像这样做:

$foo = new StdClass();
$foo->{"bar"} = '1234';
Run Code Online (Sandbox Code Playgroud)

现在尝试:

echo $foo->bar; // should display 1234
Run Code Online (Sandbox Code Playgroud)

  • 对我来说最好的答案.最好,最清楚. (7认同)
  • 很有魅力。这应该是公认的解决方案。 (3认同)

Roc*_*mat 11

如果要编辑已解码的JSON,请尝试将其作为关联数组而不是对象数组.

$data = json_decode($json, TRUE);
Run Code Online (Sandbox Code Playgroud)


Rag*_*nar 9

这是另一种方式:

$foo = (object)null; //create an empty object
$foo->bar = "12345";

echo $foo->bar; //12345
Run Code Online (Sandbox Code Playgroud)