动态创建对象属性,得到:"严格的标准:从空值"创建默认对象


Dynamically create object properties, got: "Strict standards: Creating default object from empty value"

我正在尝试动态地为对象的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);