programing

반사 클래스를 사용하여 개인/보호된 정적 속성을 설정할 수 있는 방법이 있습니까?

bestprogram 2023. 8. 30. 21:54

반사 클래스를 사용하여 개인/보호된 정적 속성을 설정할 수 있는 방법이 있습니까?

클래스의 정적 속성에 대한 백업/복원 기능을 수행하려고 합니다.반사 객체를 사용하여 모든 정적 속성과 해당 값의 목록을 가져올 수 있습니다.getStaticProperties()방법.이것은 두 가지를 모두 얻습니다.private그리고.public static속성 및 해당 값.

문제는 반사 개체를 사용하여 속성을 복원하려고 할 때 동일한 결과가 발생하지 않는 것입니다.setStaticPropertyValue($key, $value)방법.private그리고.protected변수는 이 방법에 표시되지 않습니다.getStaticProperties()일관성이 없어 보입니다.

반사 클래스를 사용하여 개인/보호된 정적 속성을 설정할 수 있는 방법이 있습니까? 또는 해당 문제에 대한 다른 방법이 있습니까?

시험을 마친

class Foo {
    static public $test1 = 1;
    static protected $test2 = 2;

    public function test () {
        echo self::$test1 . '<br>';
        echo self::$test2 . '<br><br>';
    }

    public function change () {
        self::$test1 = 3;
        self::$test2 = 4;
    }
}

$test = new foo();
$test->test();

// Backup
$test2 = new ReflectionObject($test);
$backup = $test2->getStaticProperties();

$test->change();

// Restore
foreach ($backup as $key => $value) {
    $property = $test2->getProperty($key);
    $property->setAccessible(true);
    $test2->setStaticPropertyValue($key, $value);
}

$test->test();

클래스의 개인/보호된 속성에 액세스하려면 먼저 반사를 사용하여 해당 클래스의 액세스 가능성을 설정해야 할 수 있습니다.다음 코드를 사용해 보십시오.

$obj         = new ClassName();
$refObject   = new ReflectionObject( $obj );
$refProperty = $refObject->getProperty( 'property' );
$refProperty->setAccessible( true );
$refProperty->setValue(null, 'new value');

클래스의 개인/보호된 속성에 액세스하기 위해, 반사를 사용하며, 다음을 수행할 필요가 없습니다.ReflectionObject인스턴스:

정적 속성의 경우:

<?php
$reflection = new \ReflectionProperty('ClassName', 'propertyName');
$reflection->setAccessible(true);
$reflection->setValue(null, 'new property value');


정적이 아닌 특성의 경우:

<?php
$instance = new SomeClassName();
$reflection = new \ReflectionProperty(get_class($instance), 'propertyName');
$reflection->setAccessible(true);
$reflection->setValue($instance, 'new property value');

또한 클래스 내부 메서드를 구현하여 객체 속성 액세스 설정을 변경한 다음 값을 설정할 수 있습니다.$instanve->properyname = .....:

public function makeAllPropertiesPublic(): void
{
    $refClass = new ReflectionClass(\get_class($this));
    $props = $refClass->getProperties();
    foreach ($props as $property) {
        $property->setAccessible(true);
    }
}

언급URL : https://stackoverflow.com/questions/6448551/is-there-any-way-to-set-a-private-protected-static-property-using-reflection-cla