无法通过PHP的反射获取动态实例变量

时间:2011-02-06 16:01:05

标签: php reflection

我无法通过PHP的反射获取动态实例变量

示例代码:

<?php

class Foo
{
    public function bar()
    {         
        $reflect = new ReflectionClass($this);
        $props   = $reflect->getProperties();
        var_export($props);
        die;
    }
}

$foo = new Foo();
$foo->a = "a";
$foo->b = "b";

$foo->bar(); // Failed to print out variable a and b

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

ReflectionClass::getProperties()仅获取类显式定义的属性。要反映您在对象上设置的所有属性,请使用继承自ReflectionClass的{​​{3}}并在运行时实例上运行:

$reflect = new ReflectionObject($this);

ReflectionObject,忘记反思,只需使用Tim Cooper says

答案 1 :(得分:3)

在这种情况下,您无法使用ReflectionClass。将$props变量替换为以下内容以使其正常工作:

$props = get_object_vars($this);

如果没有其他方法需要从ReflectionObject致电(请参阅BoltClock's answer),那么这是最简单的解决方案。

答案 2 :(得分:1)

class Foo { }
$foo = new Foo();
$foo->a = "a";
$foo->b = "b";
echo Reflection::export(new ReflectionObject($foo));

// Object of class [ <user> class Foo ] {
//   @@ /var/www/files/r.php 2-2
//   - Constants [0] {
//   }
//   - Static properties [0] {
//   }
//   - Static methods [0] {
//   }
//   - Properties [0] {
//   }
//   - Dynamic properties [2] {
//     Property [ <dynamic> public $a ]
//     Property [ <dynamic> public $b ]
//   }
//   - Methods [0] {
//   }
// }

答案 3 :(得分:0)

对以上两个答案的详细说明

给出一个匿名类的实例

$object             = new class()
{
    private $fooPrivate = 'barPrivate';

    public $fooPublic = 'barPublic';

    public static $fooStaticPublic = 'barStaticPublic';

    public function getProperties(): array
    {
        return get_object_vars( $this );
    }
};

$object->fooDynamic = 'barDynamic';

通过反射获取属性

ReflectionClass

/** lists: `fooPrivate`, `fooPublic`, `fooStaticPublic` */
var_export(
    ( new ReflectionClass( $object ) )
        ->getProperties()
);

/** lists: `fooPublic`, `fooStaticPublic` */
var_export(
    ( new ReflectionClass( $object ) )
        ->getProperties( ReflectionProperty::IS_PUBLIC )
);

ReflectionObject

/** lists: `fooPrivate`, `fooPublic`, `fooStaticPublic`, `fooDynamic` */
var_export(
    ( new ReflectionObject( $object ) )
        ->getProperties()
);

/** lists: `fooPublic`, `fooStaticPublic`, `fooDynamic` */
var_export(
    ( new ReflectionObject( $object ) )
        ->getProperties( ReflectionProperty::IS_PUBLIC )
);

通过get_object_vars()

获取属性
/** lists: `fooPublic`, `fooDynamic` */
var_export(
    get_object_vars( $object )
);

/** lists: `fooPrivate`, `fooPublic`, `fooDynamic` */
var_export(
    $object->getProperties()
);

摘要

  • ReflectionClass::getProperties()
    • 无法获取动态分配的属性
  • ReflectionObject::getProperties()
    • 可以获取动态分配的属性
  • ReflectionClass::getProperties()ReflectionObject::getProperties()
    • 可以获取静态属性
    • 无论属性定义了什么访问范围,都可以获取属性
    • 两者都可以通过过滤器调用
  • get_object_vars()
    • 可以获取动态分配的属性
    • 无法获取静态属性
    • 无法获取调用范围无法访问的属性,这在访问修改在OOP中的工作方式中是绝对正确的