ReflectionProperty::setValue

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::setValue设置属性值

描述

public ReflectionProperty::setValue(object $object, mixed $value): void
public ReflectionProperty::setValue(mixed $value): void

设置(更改)属性的值。

注意: 从 PHP 8.3.0 开始,使用单个参数调用此方法已被弃用,请改用 ReflectionClass::setStaticPropertyValue()

参数

object

如果属性是非静态的,则必须提供一个对象来更改其上的属性。如果属性是静态的,则必须提供一个值 null

value

新值。

返回值

不返回值。

变更日志

版本 描述
8.3.0 使用单个参数调用此方法已被弃用,应改用 ReflectionClass::setStaticPropertyValue() 来修改静态属性。
8.1.0 私有和受保护的属性可以直接通过 ReflectionProperty::setValue() 访问。以前,需要通过调用 ReflectionProperty::setAccessible() 使它们可访问;否则会抛出 ReflectionException

示例

示例 #1 ReflectionProperty::setValue() 示例

<?php
class Foo {
public static
$staticProperty;

public
$property;
protected
$privateProperty;
}

$reflectionClass = new ReflectionClass('Foo');

// 从 PHP 8.3 开始,setValue 不应再用于设置静态属性值,请改用 setStaticPropertyValue()
$reflectionClass->setStaticPropertyValue('staticProperty', 'foo');
var_dump(Foo::$staticProperty);

$foo = new Foo;

$reflectionClass->getProperty('property')->setValue($foo, 'bar');
var_dump($foo->property);

$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true); // 仅在 PHP 8.1.0 之前需要
$reflectionProperty->setValue($foo, 'foobar');
var_dump($reflectionProperty->getValue($foo));
?>

上面的示例将输出

string(3) "foo"
string(3) "bar"
string(6) "foobar"

参见

添加备注

用户贡献的备注 3 备注

up
2
me at ircmaxell dot om
13 年前
您也可以使用 ReflectionProperty::setValue 来设置静态属性的值,以及普通实例属性的值。只需传递 null 作为实例的位置

<?php
class Foo {
protected static
$bar = null;
public static function
sayBar() {
echo
self::$bar;
}
}

$r = new ReflectionProperty('Foo', 'bar');
$r->setAccessible(true);
$r->setValue(null, 'foo');

Foo::sayBar(); // "foo"
?>
up
1
p stewart imperial ac uk
1 年前
setValue 可用于只读属性,但前提是该属性尚未初始化

<?php

class Person
{
private readonly
int $age;
public function
__construct(array $props = []) {
if (isset(
$props['age'])) {
$this->age = (int)$props['age'];
}
}
}

$personWithKnownAge = new Person(['age' => 50]);

$reflection = new ReflectionProperty($personWithKnownAge, 'age');
$reflection->setValue($personWithKnownAge, 10); // 失败 - 年龄已初始化,无法更改值。

$personWithUnknownAge = new Person();

$reflection = new ReflectionProperty($personWithUnknownAge, 'age');
$reflection->setValue($personWithUnknownAge, 10); // 成功 - 年龄尚未初始化,可以设置值。
?>

这在需要从定义类之外初始化属性的情况下非常有用,例如 ORM 设置,其中父类负责设置模型子类实例的属性。
up
0
temirkhan.nasukhov
1 年前
请记住,setValue 无法用于只读属性。

<?php

class Person
{
public function
__construct(private readonly int $age) {}
}

$someOldPerson = new Person(80);

$reflection = new ReflectionProperty($someOldPerson, 'age');
$reflection->setValue($someOldPerson, 10); // 致命错误:无法修改 Person::$age 只读属性
To Top