mirror of
https://github.com/php/php-src.git
synced 2026-04-27 01:48:26 +02:00
MFH: Fix #46718: ReflectionProperty::setValue() and ReflectionProperty::setAccessible().
This commit is contained in:
@@ -4365,7 +4365,7 @@ ZEND_METHOD(reflection_property, setValue)
|
||||
METHOD_NOTSTATIC(reflection_property_ptr);
|
||||
GET_REFLECTION_OBJECT_PTR(ref);
|
||||
|
||||
if (!(ref->prop.flags & ZEND_ACC_PUBLIC)) {
|
||||
if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && ref->ignore_visibility == 0) {
|
||||
_default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC);
|
||||
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||
"Cannot access non-public member %s::%s", intern->ce->name, Z_STRVAL(name));
|
||||
@@ -4409,10 +4409,13 @@ ZEND_METHOD(reflection_property, setValue)
|
||||
zend_hash_quick_update(prop_table, ref->prop.name, ref->prop.name_length+1, ref->prop.h, &value, sizeof(zval *), (void **) &foo);
|
||||
}
|
||||
} else {
|
||||
char *class_name, *prop_name;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
zend_update_property(Z_OBJCE_P(object), object, ref->prop.name, ref->prop.name_length, value TSRMLS_CC);
|
||||
zend_unmangle_property_name(ref->prop.name, ref->prop.name_length, &class_name, &prop_name);
|
||||
zend_update_property(Z_OBJCE_P(object), object, prop_name, strlen(prop_name), value TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -2,43 +2,81 @@
|
||||
Test ReflectionProperty::setAccessible().
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class TestClass {
|
||||
public $pub;
|
||||
public $pub2 = 5;
|
||||
static public $stat = "static property";
|
||||
protected $prot = 4;
|
||||
private $priv = "keepOut";
|
||||
class A {
|
||||
protected $protected = 'a';
|
||||
protected static $protectedStatic = 'b';
|
||||
private $private = 'c';
|
||||
private static $privateStatic = 'd';
|
||||
}
|
||||
|
||||
class AnotherClass {
|
||||
}
|
||||
$a = new A;
|
||||
$protected = new ReflectionProperty($a, 'protected');
|
||||
$protectedStatic = new ReflectionProperty('A', 'protectedStatic');
|
||||
$private = new ReflectionProperty($a, 'private');
|
||||
$privateStatic = new ReflectionProperty('A', 'privateStatic');
|
||||
|
||||
$instance = new TestClass();
|
||||
|
||||
echo "\nProtected property:\n";
|
||||
$propInfo = new ReflectionProperty('TestClass', 'prot');
|
||||
try {
|
||||
var_dump($propInfo->getValue($instance));
|
||||
}
|
||||
catch(Exception $exc) {
|
||||
echo $exc->getMessage(), "\n";
|
||||
var_dump($protected->getValue($a));
|
||||
}
|
||||
|
||||
$propInfo->setAccessible(true);
|
||||
var_dump($propInfo->getValue($instance));
|
||||
catch (ReflectionException $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
$propInfo->setAccessible(false);
|
||||
try {
|
||||
var_dump($propInfo->getValue($instance));
|
||||
var_dump($protectedStatic->getValue());
|
||||
}
|
||||
catch(Exception $exc) {
|
||||
echo $exc->getMessage(), "\n";
|
||||
|
||||
catch (ReflectionException $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
var_dump($private->getValue($a));
|
||||
}
|
||||
|
||||
catch (ReflectionException $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
var_dump($privateStatic->getValue());
|
||||
}
|
||||
|
||||
catch (ReflectionException $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
$protected->setAccessible(TRUE);
|
||||
$protectedStatic->setAccessible(TRUE);
|
||||
$private->setAccessible(TRUE);
|
||||
$privateStatic->setAccessible(TRUE);
|
||||
|
||||
var_dump($protected->getValue($a));
|
||||
var_dump($protectedStatic->getValue());
|
||||
var_dump($private->getValue($a));
|
||||
var_dump($privateStatic->getValue());
|
||||
|
||||
$protected->setValue($a, 'e');
|
||||
$protectedStatic->setValue('f');
|
||||
$private->setValue($a, 'g');
|
||||
$privateStatic->setValue('h');
|
||||
|
||||
var_dump($protected->getValue($a));
|
||||
var_dump($protectedStatic->getValue());
|
||||
var_dump($private->getValue($a));
|
||||
var_dump($privateStatic->getValue());
|
||||
?>
|
||||
--EXPECTF--
|
||||
|
||||
Protected property:
|
||||
Cannot access non-public member TestClass::prot
|
||||
int(4)
|
||||
Cannot access non-public member TestClass::prot
|
||||
--EXPECT--
|
||||
string(44) "Cannot access non-public member A::protected"
|
||||
string(50) "Cannot access non-public member A::protectedStatic"
|
||||
string(42) "Cannot access non-public member A::private"
|
||||
string(48) "Cannot access non-public member A::privateStatic"
|
||||
string(1) "a"
|
||||
string(1) "b"
|
||||
string(1) "c"
|
||||
string(1) "d"
|
||||
string(1) "e"
|
||||
string(1) "f"
|
||||
string(1) "g"
|
||||
string(1) "h"
|
||||
|
||||
Reference in New Issue
Block a user