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


How to get an array of property names from base class in an inheritance context with PHP?

在这里,我有一堆实体类,如下所示:

<?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函数不起作用,因为所有属性都受到保护。

我应该改用反射吗?

提前谢谢你!

这里有一种方法可以做到这一点。

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

$result数组将保存所需的属性。

由于您尝试从类中获取变量,因此可以使用内置函数: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 {