PHP 애플리케이션을 개발하다 보면 문자열, 배열, 객체 등 다양한 형식의 데이터를 다루게 됩니다. 특히 실시간 애플리케이션에서는 PHP 객체의 결과를 연관 배열(associative array) 형태로 읽어야 원하는 출력값을 얻을 수 있는 경우가 많습니다.
이 글에서는 PHP 객체를 연관 배열로 변환하는 대표적인 두 가지 방법을 예제 코드와 함께 자세히 살펴보겠습니다.
PHP의 객체와 연관 배열이란?
객체(Object)는 클래스의 인스턴스를 의미합니다. 하나의 클래스로부터 여러 개의 객체를 생성할 수 있으며, 각 객체는 메모리가 할당된 클래스의 실체라고 할 수 있습니다.
반면 연관 배열(Associative Array)은 문자열을 인덱스(키)로 사용하는 배열입니다. 키-값 쌍으로 구성되며, 각 값은 해당 키와 연결되어 저장됩니다.
그럼 지금부터 객체를 배열로 변환하는 여러 가지 방법을 알아보겠습니다.
방법 1: json_encode()와 json_decode() 활용하기
가장 널리 사용되는 방법 중 하나는 JSON 함수를 이용하는 것입니다. 먼저 json_encode() 함수가 주어진 값을 JSON 인코딩된 문자열로 변환하고, 이어서 json_decode() 함수가 그 문자열을 PHP 배열로 되돌립니다. 두 번째 인자에 true를 전달하면 객체가 아닌 연관 배열 형태로 결과를 얻을 수 있습니다.
예제 코드
<?php
class student {
public function __construct($firstname, $lastname) {
$this->firstname = $firstname;
$this->lastname = $lastname;
}
}
$myObj = new student("Alex", "Stokes");
echo "Before conversion:".'</br>';
var_dump($myObj);
$myArray = json_decode(json_encode($myObj), true);
echo "After conversion:".'</br>';
var_dump($myArray);
?>실행 결과
Before conversion:
object(student)#1 (2) { ["firstname"]=> string(4) "Alex" ["lastname"]=> string(6) "Stokes" }
After conversion:
array(2) { ["firstname"]=> string(4) "Alex" ["lastname"]=> string(6) "Stokes" }코드 설명
위 예제에서는 student 클래스를 만들고, 클래스 내부에 __construct() 생성자 함수를 선언했습니다. 생성자는 객체가 생성되는 시점에 자동으로 실행되며, new 키워드로 객체를 생성할 때 전달된 인수들을 받아 속성을 초기화합니다.
첫 번째 var_dump() 호출에서는 객체 자체를 출력하고, 두 번째 호출에서는 json_encode()와 json_decode() 기법을 통해 객체를 배열로 변환한 결과를 출력합니다. 변환 후에는 객체가 아닌 키-값 구조의 배열이 된 것을 확인할 수 있습니다.
방법 2: 타입 캐스팅(Type Casting) 활용하기
타입 캐스팅은 하나의 데이터 타입 변수를 다른 데이터 타입으로 변환하는 방법으로, 데이터 타입의 직접적인 변환이 이루어집니다. PHP에서는 객체 앞에 (array)를 붙이는 것만으로 별도의 함수 없이 간단하게 배열로 변환할 수 있습니다.
예제 코드
<?php
class bag {
public function __construct( $item1, $item2, $item3){
$this->item1 = $item1;
$this->item2 =$item2;
$this->item3 = $item3;
}
}
$myBag = new bag("Books", "Ball", "Pens");
echo "Before conversion :".'</br>';
var_dump($myBag);
$myBagArray = (array)$myBag;
echo "After conversion :".'</br>';
var_dump($myBagArray);
?>실행 결과
Before conversion :
object(bag)#1 (3) { ["item1"]=> string(5) "Books" ["item2"]=> string(4) "Ball" ["item3"]=> string(4) "Pens" }
After conversion:
array(3) { ["item1"]=> string(5) "Books" ["item2"]=> string(4) "Ball" ["item3"]=> string(4) "Pens" }코드 설명
여기서는 bag 클래스를 생성하고 내부에 __construct() 함수를 선언했습니다. 이 생성자 역시 객체 생성 시점에 실행되며, new 키워드로 객체를 만들 때 전달된 인수들을 받아 각 속성에 저장합니다.
첫 번째 var_dump()에서는 객체를 그대로 출력하고, 두 번째에서는 (array) 타입 캐스팅 문법을 사용해 객체를 배열로 변환한 뒤 출력합니다. 단 한 줄의 코드로 변환이 가능하다는 점이 이 방법의 가장 큰 장점입니다.
주의사항과 마무리
참고: 타입 캐스팅 방식은 private 또는 protected 속성이 포함된 경우 키 이름에 클래스명이나 null 바이트(\0*\0)가 섞일 수 있으므로 주의가 필요합니다. 반면 json_encode()/json_decode() 조합은 public 속성만 변환되지만 중첩된 객체 구조도 안전하게 처리할 수 있다는 장점이 있습니다.
두 방법 모두 실무에서 유용하게 활용되므로, 데이터 구조와 요구 사항에 맞는 적절한 방법을 선택해 사용하시기 바랍니다.