无法通过PHP';获取动态实例变量;s反射
我无法通过PHP的反射获取动态实例变量 示例代码:无法通过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
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] {
// }
// }