0

我刚刚遇到了一些奇怪的事情。我有一个与此类似的课程:

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的实例,$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)我可以修改私有元素。所以我有一个解决方法,但很高兴知道为什么会发生这种情况。

4

3 回答 3

2

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

$array里面真正的键不是 Testhiddenand Testotherhidden。你可以很容易地看到

print_r(array_map('urlencode', array_keys($array)));

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

于 2013-08-09T15:36:12.120 回答
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);
}
于 2013-08-09T15:36:06.877 回答
0

var_dump 会告诉你答案。受保护属性的数组键正在变成 "\0Test\0otherhidden""\0Test\0hidden"。print_r 正在向您掩盖这一事实。

于 2013-08-09T15:42:00.003 回答