无法通过PHP';获取动态实例变量;s反射

无法通过PHP';获取动态实例变量;s反射,php,reflection,Php,Reflection,我无法通过PHP的反射获取动态实例变量 示例代码: <?php class Foo { public function bar() { $reflect = new ReflectionClass($this); $props = $reflect->getProperties(); var_export($props); die; } } $foo = new Foo(

我无法通过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

在这种情况下不能使用
ReflectionClass
。将
$props
变量替换为以下变量以使其工作:

$props = get_object_vars($this);

如果没有其他方法需要从
ReflectionObject
(请参阅)调用,那么这是最简单的解决方案。

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

$reflect = new ReflectionObject($this);
或者,忘记反射,改用反射。

以上两种答案的详细解释 给定匿名类的实例

$object=新类()
{
private$foopprivate='barPrivate';
public$fooPublic='barPublic';
public static$fooStaticPublic='barStaticPublic';
公共函数getProperties():数组
{
返回get\u object\u vars($this);
}
};
$object->fooDynamic='barDynamic';

通过反射获取属性 使用
ReflectionClass
/**列表:`foopprivate`、`fooPublic`、`fooStaticPublic`*/
瓦鲁出口(
(新的ReflectionClass($object))
->getProperties()
);
/**列表:`fooPublic`、`fooStaticPublic`*/
瓦鲁出口(
(新的ReflectionClass($object))
->getProperties(ReflectionProperty::是公共的)
);
使用
ReflectionObject
/**列表:`foopprivate`、`fooPublic`、`fooStaticPublic`、`fooDynamic`*/
瓦鲁出口(
(新的ReflectionObject($object))
->getProperties()
);
/**列表:`fooPublic`、`fooStaticPublic`、`fooDynamic`*/
瓦鲁出口(
(新的ReflectionObject($object))
->getProperties(ReflectionProperty::是公共的)
);

通过
get\u object\u vars()获取属性
/**列表:`fooPublic`、`fooDynamic`*/
瓦鲁出口(
获取对象变量($object)
);
/**列表:`fooPrivate`、`fooPublic`、`fooDynamic`*/
瓦鲁出口(
$object->getProperties()
);

总结
  • ReflectionClass::getProperties()
    • 无法获取动态分配的属性
  • ReflectionObject::getProperties()
    • 可以获取动态分配的属性
  • ReflectionClass::getProperties()
    ReflectionObject::getProperties()
    
    • 可以获取静态属性
    • 可以获取属性,无论其定义的访问范围如何
    • 两者都可以通过过滤器调用
  • get\u object\u vars()
    • 可以获取动态分配的属性
    • 无法获取静态属性
    • 无法获取调用作用域无权访问的属性,这在OOP中修改访问权限的方式是绝对正确的
class Foo{}
$foo=新foo();
$foo->a=“a”;
$foo->b=“b”;
回波反射::导出(新的反射对象($foo));
//类的对象[类Foo]{
//@@/var/www/files/r.php 2-2
//-常数[0]{
//   }
//-静态属性[0]{
//   }
//-静态方法[0]{
//   }
//-属性[0]{
//   }
//-动态特性[2]{
//物业〔公帑一元〕
//物业〔公帑乙元〕
//   }
//-方法[0]{
//   }
// }

@BoltClock时间过得很快,我们注意到,在某些版本的PHP7.0.*中,通过PHP-FPM运行(在PHP7.0.10中已确认存在,相信在7.0.17中已修复,但在7.0.20中肯定已修复),
get_object_vars()
不会返回任何动态添加的对象/类属性,仅由类显式定义的公共属性。这是早期和更高版本的PHP中未记录的行为变化。在短期内升级服务器不可能/不可行的情况下,
ReflectionObject
框架为
get\u object\u vars()临时中断的功能提供了可行的解决方案。
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] {
//   }
// }