1
0
mirror of https://github.com/php/php-src.git synced 2026-04-01 21:22:13 +02:00
Files
archived-php-src/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt
Christoph M. Becker 26aefb750a Fix #69804: ::getStaticPropertyValue() throws on protected props
`ReflectionClass` allows reading of the values of private and protected
constants, and also to get private and protected static methods.
Therefore getting the values of private and protected static properties
is also permissible, especially since `::getStaticProperties()` already
allows to do so.

We also allow ::setStaticPropertyValue() to modify private and
protected properties, because otherwise this method is useless, as
modifying public properties can be done directly.
2020-06-24 11:17:36 +02:00

78 lines
2.2 KiB
PHP

--TEST--
ReflectionClass::setStaticPropertyValue()
--CREDITS--
Robin Fernandes <robinf@php.net>
Steve Seear <stevseea@php.net>
--FILE--
<?php
class A {
static private $privateOverridden = "original private";
static protected $protectedOverridden = "original protected";
static public $publicOverridden = "original public";
}
class B extends A {
static private $privateOverridden = "changed private";
static protected $protectedOverridden = "changed protected";
static public $publicOverridden = "changed public";
}
echo "Set static values in A:\n";
$rcA = new ReflectionClass('A');
$rcA->setStaticPropertyValue("privateOverridden", "new value 1");
$rcA->setStaticPropertyValue("protectedOverridden", "new value 2");
$rcA->setStaticPropertyValue("publicOverridden", "new value 3");
print_r($rcA->getStaticProperties());
echo "\nSet static values in B:\n";
$rcB = new ReflectionClass('B');
$rcB->setStaticPropertyValue("privateOverridden", "new value 4");
$rcB->setStaticPropertyValue("privateOverridden", "new value 5");
$rcB->setStaticPropertyValue("protectedOverridden", "new value 6");
$rcB->setStaticPropertyValue("publicOverridden", "new value 7");
print_r($rcA->getStaticProperties());
print_r($rcB->getStaticProperties());
echo "\nSet non-existent values from A with no default value:\n";
try {
var_dump($rcA->setStaticPropertyValue("protectedDoesNotExist", "new value 8"));
echo "you should not see this";
} catch (Exception $e) {
echo $e->getMessage() . "\n";
}
try {
var_dump($rcA->setStaticPropertyValue("privateDoesNotExist", "new value 9"));
echo "you should not see this";
} catch (Exception $e) {
echo $e->getMessage() . "\n";
}
?>
--EXPECT--
Set static values in A:
Array
(
[privateOverridden] => new value 1
[protectedOverridden] => new value 2
[publicOverridden] => new value 3
)
Set static values in B:
Array
(
[privateOverridden] => new value 1
[protectedOverridden] => new value 2
[publicOverridden] => new value 3
)
Array
(
[privateOverridden] => new value 5
[protectedOverridden] => new value 6
[publicOverridden] => new value 7
)
Set non-existent values from A with no default value:
Class A does not have a property named protectedDoesNotExist
Class A does not have a property named privateDoesNotExist