所以我正在使用一个设置类,它扩展了一个类似于“全局设置”的基本设置类。有几个服务,每个服务都有自己的设置类,它扩展了抽象的基本设置类。抽象基本设置类对应于服务之间共享的设置。所以首先我会用下面的例子来说明,然后我会定义问题:
例子:
abstract class BaseSettings {
protected $settingA;
protected $settingB;
}
class MyServiceSettings extends BaseSettings {
private $settingC;
public $settingD;
}
问题:
如果我像这样创建一个 ReflectionClass 实例..
$reflect = new ReflectionClass($this);
..从 MyServiceSettings 类或 BaseSettings 类(因为显然你不能拥有抽象类的实例),$reflect->getProperties()
将始终返回的属性MyServiceSettings 和 BaseSettings(我想这是合适的,因为我们实际上是在使用一个具体的类)
现在我确定我可以创建一个空类来扩展抽象 BaseClass 以确定哪些属性去哪里(或者只是摆脱抽象并创建 BaseClass 的实例),但这看起来相当困惑,所以我我想知道是否有更优雅的方法来确定哪些属性属于父类,哪些属性属于子类?
如果您对我为什么要这样做感到好奇 - 我正在将设置序列化到一个 .json 文件,以实现我添加的恢复功能,以便可以从上次成功完成的最后一个原子操作继续。为什么我必须这样做 - 环境的限制。
最佳答案
我会这样得到它:
$class = new ReflectionClass('Some_class_name');
$properties = array_filter($class->getProperties(), function($prop) use($class){
return $prop->getDeclaringClass()->getName() == $class->getName();
});
所以基本上获取所有属性并遍历它们,检查它们是否在我们反射(reflect)的类中声明。
关于php反射获取属性而不获取基类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14636999/