我只是遇到了一些奇怪的东西。我有一个与此类似的课程:
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)
,我可以修改私有元素。所以我有一个解决方法,但知道为什么会发生这种情况仍然很好。
答案 0 :(得分:2)
您看到的行为是因为将对象转换为数组时,与非公共属性对应的数组的键前缀为不可打印的“魔术”字符串。
$array
内的真实密钥不是 Testhidden
和Testotherhidden
。您可以通过
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正在掩盖你的这个事实。