|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #69456 can't set protected / private static methods on ReflectionClass object
Submitted: 2015-04-15 05:51 UTC Modified: 2015-04-15 06:34 UTC
From: cameron at datashovel dot com Assigned:
Status: Not a bug Package: Reflection related
PHP Version: 5.5.23 OS: AWS Linux
Private report: No CVE-ID: None
 [2015-04-15 05:51 UTC] cameron at datashovel dot com
I can't seem to set new values on static properties using either setValue or setStaticPropertyValue using ReflectionClass

Test script:

$array = array(
    'blah1' => 1,
    'blah2' => 2,
    'blah3' => 3

class Blah
    public static $blah1 = 4;
    protected static $blah2 = 5;
    private static $blah3 = 6;

$rc = new ReflectionClass('Blah');

// brand new ReflectionClass

$static = $rc->getProperties(ReflectionProperty::IS_STATIC);
$obj = $rc->newInstanceWithoutConstructor();
foreach($static as $prop){
        $prop->setValue($obj, $arr[$prop->getName()]);
        $rc->setStaticPropertyValue($prop->getName(), self::cast($arr[$prop->getName()]));
$obj2 = $rc->newInstanceWithoutConstructor();

// instantiate class after ReflectionClass has set all property values

// class instantiated before ReflectionClass captured ReflectionClass values
// but after we have called "setValue"

Expected result:
either by calling setValue OR by instantiating a new instance AFTER setting the Static properties on the ReflectionClass object I should be able to set static values.

Obviously public static is less of an issue because since I could just go in afterward and set the value on the instance.  But protected and private pose a problem because unless I create special setters / getters I will be unable to set custom values on these properties through reflection.

Actual result:
object(ReflectionClass)#1 (1) {
  string(4) "Blah"
object(Blah)#6 (0) {
object(Blah)#5 (0) {


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2015-04-15 05:56 UTC] cameron at datashovel dot com
Still think it's a bug, but found I accidentally introduced code from the project I was working on where I experienced this.

In the test script you can change:

$rc->setStaticPropertyValue($prop->getName(), self::cast($arr[$prop->getName()]));

$rc->setStaticPropertyValue($prop->getName(), self::cast($arr[$prop->getName()]));
 [2015-04-15 05:58 UTC] cameron at datashovel dot com
This is embarassing :)  Just realized both lines are same.  This should fix it.

In the test script you can change:

$rc->setStaticPropertyValue($prop->getName(), self::cast($arr[$prop->getName()]));

$rc->setStaticPropertyValue($prop->getName(), $arr[$prop->getName()]);
 [2015-04-15 06:18 UTC]
-Status: Open +Status: Not a bug
 [2015-04-15 06:18 UTC]
1. You named the array "$array" but try to use "$arr".
2. You can't use setStaticPropertyValue() on an inaccessible property.

Fixing #1 and commenting out that line for #2 gives me the expected output of two "int(1)"s.
 [2015-04-15 06:34 UTC] cameron at datashovel dot com
Ugh, I try to avoid reporting issues late at night for this exact reason.  Thanks for the catch.
PHP Copyright © 2001-2023 The PHP Group
All rights reserved.
Last updated: Sun Sep 24 17:01:24 2023 UTC