$obj = (object)array('a', 'b', 'c');
$refl = new \ReflectionObject($obj);
$props = $refl->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);
foreach($props as $prop)
print $prop->name;
打印一些奇怪的名称,例如line
,file
和line
(而不是 1、2、3)。为什么?我意识到名称是无效的,因为它们是数字,但是为什么我会得到这些随机字符串?
get_object_vars($obj)
什么都不显示,print_r((array)$obj)
实际上正确打印了值。
如果反射不能显示数字属性,有什么办法可以让它忽略它们吗?
它也发生在许多 SPL 交互器(如ArrayObject
s、SplFixedArray
s、SplHeap
s)上。显然这种行为只存在于某些 PHP 5.3 版本中。PHP 5.4 什么也没显示。
相关的 PHP 错误和我对解决方案的看法(property_exists
忽略无效名称):
if(version_compare(PHP_VERSION, '5.4') < 0){
$props = array_filter($props, function($prop) use($obj){
return !$prop->isPublic() || property_exists($obj, $prop->name);
});
}