Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP从继承上下文中的基类获取属性名数组?_Php_Arrays_Oop_Reflection - Fatal编程技术网

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

如何使用PHP从继承上下文中的基类获取属性名数组?,php,arrays,oop,reflection,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 con

这里我有一组实体类,它们是这样组成的:

<?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
}
?>

这里有一种方法

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

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

由于您试图从类中获取变量,因此可以使用内置函数:
get\u class\u 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 )

参考文献:

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


侧注:如果不希望实例化
基本模型
类,请将其更改为抽象类:

abstract class BaseModel {

您当前的方法有效,除了键前面有“*`like
[*Bar]=>[*Baz]=>[*Loo]=>[*Id]=>[*CreateDate]=>[*LastUpdateDate]=>
您尝试过@AbraCadaver吗谢谢您的评论。当我迭代生成的数组时,类似这样的
foreach($k=>$v)的键(
$k
)是空的。。。我不知道我错在哪里…@FirstOne谢谢你的评论。我来看看!o/@FirstOne你能把这个作为回答吗?我使用
返回数组_键(get_class_vars(get_class($this))解决了这个问题
at
getClassFields()
方法。非常感谢。