Object to Array之后的受保护数组元素

时间:2013-08-09 15:26:11

标签: php arrays object

我只是遇到了一些奇怪的东西。我有一个与此类似的课程:

class Test {
    public $id;
    public $name;
    public $details;

    private $hidden;
    private $otherhidden;

    public function __construct() {
         $this->id = 1;
         $this->name = 'test';
         $this->details = 'test';
         $this->hidden = 1;
         $this->otherhidden = 1;
    }

    public function toArray() {
        $array = (array) $this;
        print_r($array);
        $array['Testhidden'] = 2;
        $array['Testotherhidden'] = 2;
        unset($array['details']);
        unset($array['Testhidden']);
        unset($array['Testotherhidden']);
        print_r($array);
        return $array;
    }
}

如果我创建了一个测试实例,$test = new Test;然后运行$array = $test->toArray();,则打印出的两个数组是:

Array
(
    [id] => 1
    [name] => test
    [details] => test
    [Testhidden] => 1
    [Testotherhidden] => 1
)
Array
(
    [id] => 1
    [name] => test
    [Testhidden] => 1
    [Testotherhidden] => 1
)

因此,它允许我取消设置数组中的details键控项,但它不允许我修改值或取消设置对象中私有的元素中的值。为什么它不会让我修改数组的值?显然,有一些类型的继承从对象传递给数组。

修改

如果我使用get_object_vars()代替(array),我可以修改私有元素。所以我有一个解决方法,但知道为什么会发生这种情况仍然很好。

3 个答案:

答案 0 :(得分:2)

您看到的行为是因为将对象转换为数组时,与非公共属性对应的数组的键前缀为不可打印的“魔术”字符串。

$array内的真实密钥不是 TesthiddenTestotherhidden。您可以通过

轻松查看
print_r(array_map('urlencode', array_keys($array)));

我随机选择了urlencode作为将不可打印字符转换为可打印表示的一种非常方便的方法,但当然任何其他具有该属性的函数都可以用作。

答案 1 :(得分:0)

这篇文章将回答你的问题。

http://www.vancelucas.com/blog/get-only-public-class-properties-for-current-class-in-php/

但基本上你得到的属性是因为调用get_object_vars()的范围。但是如果您按照帖子中的描述更改范围,您应该得到您正在寻找的结果。

public function toArray()
{
    $getFields = function($obj) { return get_object_vars($obj); };
    return $getFields($this);
}

答案 2 :(得分:0)

var_dump会显示答案。受保护属性的数组键正在变为 "\0Test\0otherhidden""\0Test\0hidden"。 print_r正在掩盖你的这个事实。