我正在尝试动态地为对象的JSON表示创建对象属性。类User
将具有一些默认属性(在__construct
中设置)。我使用自定义对象而不是数组,因为我更喜欢面向对象的风格(我还需要自定义setter/getter方法)。
然而,第一次尝试给了我:
严格标准:从空值创建默认对象。
,即使代码实际工作(json_encode
显示正确的输出):
<?php
class User
{
protected $data = array();
public function __set($property, $value)
{
$this->data[$property] = $value;
}
}
$u = new User();
$u->name = "James Smith"; // Works
$u->status->active = false; // Fail
$u->status->modified = time();
var_dump(json_encode($u));
?>
我认为这是因为调用了$u->status->active
,而属性$u->status
还不存在。你知道怎么修复这个吗?
好的,我帮你整理好了:)很有趣。
首先,您没有初始化status属性。因此,理论上,这应该是足够的:
$u->status = new StdClass;
然而,它比这更复杂。即使你这样做,也不会奏效。这是因为您在数据数组中设置了字段,但您从未从那里获取它们!
所以当你访问一个字段($u->status)时,你并没有使用你刚刚设置的字段:你正在访问一个未设置的对象属性。如果你试图在设置完$u->name后打印它,你将不会得到任何东西,因为你没有创建一个getter函数来读取你的数据数组。
你应该要么创建一个getter,要么删除setter(无论如何它都可以工作,但可能不是你需要的)。
如果注释掉setter,一切都可以正常工作,没有警告。请看这个简化版本:
<?php
error_reporting(E_STRICT);
class User
{
}
$u = new User();
$u->name = "James Smith";
$u->status = new StdClass; // Comment this line and you will get the strict warning
$u->status->active = false;
var_dump($u);