读写一个对象的非公开属性
问题
假设有以下对象, 如何读写其中的非公开属性?
<?php
class Dog
{
private $name = 'jim';
private $age = 3;
protected $master = 'keta';
public $color = 'black';
}
$dog = new Dog();
- 使用数组读
$dogArray = (array)$dog;
$name = $dogArray["\0Dog\0name"];
$age = $dogArray["\0Dog\0age"];
$master = $dogArray["\0*\0master"];
$color = $dogArray['color'];
var_dump($dog, $dogArray, $name, $age, $master, $color);
结果:
2. 使用反射读写
$refName = new ReflectionProperty('Dog', 'name');
/* >>> */$refName->setAccessible(true); /* <<< */
// 读
$name = $refName->getValue($dog);
var_dump($dog, $name);
// 写
$refName->setValue($dog, 'hanmeimei');
var_dump($dog);
结果:
3. 使用匿名函数读写
$rw = Closure::bind(function ($key, $value = null) {
if (null !== $value)
{
$this->$key = $value;
return;
}
return $this->$key;
}, $dog, Dog::class);
// 读
$name = $rw('name');
var_dump($dog, $name);
// 写
$rw('name', 'kailei');
var_dump($dog);
结果: