You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:53:16