如何使用PHP从继承上下文中获取基类的属性名数组?

时间:2016-03-04 20:05:19

标签: php arrays oop reflection

这里我有一堆像这样组成的实体类:

<?php
class BaseModel {
    protected $Id;
    protected $CreateDate;
    protected $LastUpdateDate;
    // public setters, getters and validation methods
    public function getClassFields(){
        // how to get an array containing all property names,
        // including those from inherited classes?
        $array = (array) $this; //this do not work =(
        return $array;
    }
}

class FooModel extends BaseModel {
    protected $Bar;
    protected $Baz;
    protected $Loo;
    // public setters, getters and validation methods
}
?>

我想获得一个包含["Id", "CreateDate", "LastUpdateDate", "Bar", "Baz", "Loo"]的数组。我该如何做到这一点?

我尝试过的事情:

当我尝试从类外部执行数组转换$array = (array) new FooModel()或从基类内部执行$array = (array) $this时,两者都不起作用...我认为get_object_vars函数不在#39;因为所有属性都受到保护而工作。

我应该使用反射吗?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

这是一种方法。

$ref = new ReflectionClass('FooModel');
$properties = $ref->getProperties();
$result = array();
foreach($properties as $i=>$prop){ 
  $result[] = $prop->getName();
}

$ result数组将保存您想要的属性。

答案 1 :(得分:1)

由于您尝试从类中获取变量,因此可以使用内置函数:get_class_vars

所以这里有更详细的内容......

用以下代码替换您的代码:

class BaseModel {
    protected $Id;
    protected $CreateDate;
    protected $LastUpdateDate;
    // public setters, getters and validation methods
    public function getClassFields(){
        return array_keys(get_class_vars(get_class($this))); // changed
    }
}

class FooModel extends BaseModel {
    protected $Bar;
    protected $Baz;
    protected $Loo;
    // public setters, getters and validation methods
}

然后,如果您使用:

$foo = new BaseModel();
print_r($foo->getClassFields());

输出结果为:

Array ( [0] => Id [1] => CreateDate [2] => LastUpdateDate )

如果你在孩子身上使用它:

$bar = new FooModel();
print_r($bar->getClassFields());

输出现在是:

Array ( [0] => Bar [1] => Baz [2] => Loo [3] => Id [4] => CreateDate [5] => LastUpdateDate )

<强>参考文献:

get_class返回对象类的名称
get_class_vars获取班级的默认属性
array_keys:返回数组的所有键或键的子集

旁注:如果您不希望实例化BaseModel类,请将其更改为摘要:

abstract class BaseModel {