这里我有一堆像这样组成的实体类:
<?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;因为所有属性都受到保护而工作。
我应该使用反射吗?
提前谢谢!
答案 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 {