我正在尝试为对象的JSON表示动态创建对象属性。类User
将具有一些默认属性(在__construct
中设置)。我使用自定义对象而不是数组,因为我更喜欢面向对象的样式(我还需要自定义setter / getters方法)。
然而,第一次尝试给了我:
严格标准:从空值创建默认对象。
即使代码确实有效(并且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
。 你知道如何解决这个问题吗?
答案 0 :(得分:1)
好的,我为你排序了:)很有意思。
首先,您尚未初始化status属性。所以从理论上讲,这应该足够了:
$u->status = new StdClass;
然而,它比这更复杂。即使你这样做,它也行不通。那是因为你在数据数组中设置你的字段,但你永远不会从那里开始!
因此,当您访问某个字段($ u-&gt; status)时,您没有获取刚刚设置的字段:您正在访问未设置的对象属性。如果您在设置之后尝试打印$ u-&gt; 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);