在这里,我有一堆实体类,如下所示:
<?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 {