반사 클래스를 사용하여 개인/보호된 정적 속성을 설정할 수 있는 방법이 있습니까?
클래스의 정적 속성에 대한 백업/복원 기능을 수행하려고 합니다.반사 객체를 사용하여 모든 정적 속성과 해당 값의 목록을 가져올 수 있습니다.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
'programing' 카테고리의 다른 글
Git에서 동일한 커밋의 파일에 현재 커밋 해시를 쓰는 방법은 무엇입니까? (0) | 2023.08.30 |
---|---|
Solr을 고려해야 할 시기 (0) | 2023.08.30 |
Oracle Date 데이터 유형, 'YYYY-MM-DD HH24:MI:SSTMZ' ~ SQL (0) | 2023.08.30 |
다음을 사용하여 요소 뒤에 공백("")을 추가합니다. (0) | 2023.08.30 |
JavaScript에서 본문과 함께 GET 요청 보내기(XMLHttpRequest) (0) | 2023.08.30 |