如何用PHP反射获取类中除静态属性外的所有属性?
嘿,我来帮你排查这个问题——你这里有两个关键的小错误,导致结果不符合预期:
1. 位运算符用错了
ReflectionClass::getProperties() 方法需要的是**按位或(|)**来组合属性类型标志,而你用了逻辑或(||)。逻辑或的结果是布尔值 true(对应整数 1),这相当于你只请求了 ReflectionProperty::IS_PUBLIC 类型的属性——这就是为什么只返回了那个public的static属性(如果它是public的话)。
2. 没有排除静态属性
你的目标是获取非静态属性,但原代码没有明确排除 IS_STATIC 标志,所以即使运算符正确,也会把静态属性包含进来。
解决方法
这里有两种可靠的方式实现你的需求:
方法一:用正确的位掩码直接获取非静态属性
直接组合所有非静态属性的位掩码,明确排除静态属性:
$rc = new \ReflectionClass($this); $nonStaticProps = $rc->getProperties( ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE );
这个掩码表示我们只获取非静态的public/protected/private属性,因为IS_STATIC是独立的标志,没有被包含在组合里。
方法二:获取所有属性后过滤静态属性
如果觉得位掩码不好记,也可以先获取所有属性,再用反射方法过滤掉静态的:
$rc = new \ReflectionClass($this); $allProps = $rc->getProperties(); $nonStaticProps = array_filter($allProps, function(\ReflectionProperty $prop) { return !$prop->isStatic(); });
这种方式更直观,可读性更强,适合对反射API不太熟悉的场景。
两种方法都能帮你得到那3个private非静态属性,完美排除那个static属性~
内容的提问来源于stack exchange,提问作者toddmo
相关产品推荐
相关产品推荐

