最近有個需求,要把數據庫裏查出來的數據轉成對應的實體對象(自定義的實體對象)
php數組轉對象網上提供了一個這樣的方法
function array_to_object($arr)
{
if (gettype($arr) != 'array') {
return;
}
foreach ($arr as $k => $v) {
if (gettype($v) == 'array' || getType($v) == 'object') {
$arr[$k] = (object)array_to_object($v);
}
}
return (object)$arr;
}
$arr = ['name' => "aa", "id" => 3, "age" => ['name' => "aa", "id" => 3, "age" => 2]];
var_dump(array_to_object($arr));
能轉沒毛病,,但是php的數組轉對象貌似可以更簡單更通俗(json序列化,再json反序列化成對象)
var_dump(json_decode(json_encode($arr)));
這僅僅是數組轉對象的方案,,想轉實體對象(自己定義的對象)還需要用反射,下面提供簡單實例:
/**
* 測試類Student
* Class Student
*/
class Student
{
private $name;
private $id;
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name): void
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id): void
{
$this->id = $id;
}
}
/**
* 【1】反射創建類的操作對象,$reflectionClass
* 【2】創建臨時代理對象$obj
* 【3】將參數逐一賦值給$obj
* 【4】那麼此時的$obj就是數組對應的實體類(此處不包含嵌套,只支持簡單對象轉)
* @param array $arr
* @param string $className
*
* @return object
* @throws ReflectionException
*/
function arrayToSimpleObj(array $arr, string $className)
{
$reflectionClass = new ReflectionClass($className);
$obj = $reflectionClass->newInstance();
foreach ($arr as $key => $value) {
$property = $reflectionClass->getProperty($key);
$property->setAccessible(true);//私有屬性需要設置允許訪問
$property->setValue($obj, $value);
}
return $obj;
}
$arr = ['name' => "aa", "id" => 3];
try {
var_dump(arrayToSimpleObj($arr, Student::class));
} catch (ReflectionException $e) {
echo "轉換失敗";
}
$arr = ['name' => "aa", "id" => 3, "age" => 2];
try {
var_dump(arrayToSimpleObj($arr, Student::class));
} catch (ReflectionException $e) {
echo "轉換失敗";
}