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

时间:2011-12-21 14:10:27

标签: php arrays oop object

我正在尝试为对象的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你知道如何解决这个问题吗?

1 个答案:

答案 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);