PHP에서 객체를 연관 배열로 변환하기
PHP 개발을 하다 보면 객체(object)의 데이터를 연관 배열(associative array) 형태로 다뤄야 할 때가 자주 있습니다. 예를 들어 JSON 데이터를 가공하거나, 배열 전용 내장 함수를 활용하고 싶을 때가 대표적입니다. 이번 글에서는 가장 많이 사용되는 두 가지 변환 방법을 예제 코드와 실행 결과와 함께 살펴보겠습니다.
방법 1: json_encode()와 json_decode() 조합
json_encode()로 객체를 JSON 문자열로 변환한 뒤, json_decode()의 두 번째 인자로 true를 전달하면 결과가 연관 배열로 반환됩니다. 중첩된 객체까지 한 번에 배열로 바꿔준다는 장점이 있습니다.
예제
<?php
class department {
public function __construct($deptname, $deptzone) {
$this->deptname = $deptname;
$this->deptzone = $deptzone;
}
}
$myObj = new department("Marketing", "South");
echo "변환 전:"."\n";
var_dump($myObj);
$myArray = json_decode(json_encode($myObj), true);
echo "변환 후:"."\n";
var_dump($myArray);
?>
실행 결과
위 코드를 실행하면 다음과 같은 출력을 확인할 수 있습니다.
변환 전:
object(department)#1 (2) {
["deptname"]=>
string(9) "Marketing"
["deptzone"]=>
string(5) "South"
}
변환 후:
array(2) {
["deptname"]=>
string(9) "Marketing"
["deptzone"]=>
string(5) "South"
}
방법 2: (array) 타입 캐스팅
더 간단한 방법은 타입 캐스팅(type casting)입니다. 객체 앞에 (array)를 붙여주기만 하면 즉시 배열로 변환됩니다. 별도의 함수 호출 없이 한 줄로 처리할 수 있어 성능 면에서도 유리합니다.
예제
<?php
class department {
public function __construct($deptname, $deptzone) {
$this->deptname = $deptname;
$this->deptzone = $deptzone;
}
}
$myObj = new department("Marketing", "South");
echo "변환 전:"."\n";
var_dump($myObj);
$arr = (array)$myObj;
echo "변환 후:"."\n";
var_dump($arr);
?>
실행 결과
변환 전:
object(department)#1 (2) {
["deptname"]=>
string(9) "Marketing"
["deptzone"]=>
string(5) "South"
}
변환 후:
array(2) {
["deptname"]=>
string(9) "Marketing"
["deptzone"]=>
string(5) "South"
}
두 방법의 차이점과 주의 사항
두 방식 모두 동일한 결과를 출력하지만, 내부적으로 몇 가지 차이가 있으므로 상황에 맞게 선택하는 것이 좋습니다.
1. 접근 제어자 처리 — (array) 캐스팅은 private, protected 속성도 변환하지만 키 이름 앞에 널 문자(\0)가 포함될 수 있습니다. 반면 json_encode()/json_decode() 방식은 public 속성만 변환하며 나머지는 무시됩니다.
2. 중첩 구조 처리 — JSON 기반 방식은 객체 안에 객체가 있는 경우에도 재귀적으로 모두 배열로 변환해 주지만, 단순 캐스팅은 최상위 속성만 배열로 바꾸고 내부 객체는 그대로 유지됩니다.
3. 성능 — 단순히 최상위 속성만 필요하다면 (array) 캐스팅이 더 빠르고 효율적입니다. JSON 직렬화·역직렬화 과정을 거치지 않기 때문입니다.
정리하면, 일반적인 public 속성 변환에는 간결한 (array) 캐스팅을, 중첩 객체를 깊이 있게 변환해야 한다면 json_decode(json_encode(...), true) 방식을 사용하는 것이 좋습니다.