너무 비슷한 3형제
[ var_dump | var_export | print_r ]
var_dump, var_export, print_r 함수들은 모두 비슷한 기능을 가지고 있어서, 도대체 언제 어떤 함수를 사용해야할지 매번 헷갈립니다. 이번 포스트에서는 어떤 함수를 사용해야할지에 대해서 정확히 알아 보겠습니다.
[1] 간단 비교
3 형제들은 각각의 자료형을 어떻게 표시하는지 예제를 통해서 보겠습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
$arr = [
1, // 숫자 int
3.14, // 숫자 float
‘string’, // 문자열
”, // 빈 문자열
‘ ‘, // 스페이스 넣은 문자열
null, // null 값
true, // 불리언 true
false, // 불리언 false;
new stdClass() // 객체
];
echo ‘[ var_dump ]<br>’;
var_dump($arr);
echo ‘<br><br>[ var_export ]<br>’;
var_export($arr);
echo ‘<br><br>[ print_r ]<br>’;
print_r($arr);
?>
|
[ var_dump ]
array(9) { [0]=> int(1) [1]=> float(3.14) [2]=> string(6) “string” [3]=> string(0) “” [4]=> string(1) ” ” [5]=> NULL [6]=> bool(true) [7]=> bool(false) [8]=> object(stdClass)#1 (0) { } }
[ var_export ]
array ( 0 => 1, 1 => 3.14, 2 => ‘string’, 3 => ”, 4 => ‘ ‘, 5 => NULL, 6 => true, 7 => false, 8 => stdClass::__set_state(array( )), )
[ print_r ]
Array ( [0] => 1 [1] => 3.14 [2] => string [3] => [4] => [5] => [6] => 1 [7] => [8] => stdClass Object ( ) )
-
- 목표:
- ‣ 각각의 자료형에 따라서 var_dump, var_export, print_r들이 어떻게 출력하는지 확인합니다.
- (1) var_dump
- ‣ var_dump는 자료형을 확인하는 목적으로 만들어졌습니다. 출력결과를 보면서 설명해 보겠습니다.
- [ var_dump ] array(9) { [0]=> int(1) [1]=> float(3.14) [2]=> string(6) “string” [3]=> string(0) “” [4]=> string(1) ” ” [5]=> NULL [6]=> bool(true) [7]=> bool(false) [8]=> object(stdClass)#1 (0) { } }
- ‣ “자료형이 크기를 가지는 경우“와 “크기를 가지지 않는 경우“로 나눠서 생각해 볼 수 있습니다. 자료형이 크기를 가지고 있을 수 있는 경우에는 자료형(크기) 값 형태로 표시하고, 크기를 가지지 않는 경우에는 자료형(값) 형태로 표시합니다.
- ‣ 크기를 가지는 경우(배열, 객체, 문자열): $arr는 배열이므로 array(9) 와 같이 자료형과 배열의 크기를 괄호안에 보여줍니다. 객체의 경우 object(stdClass)#1 (프로퍼티갯수) {} 형태로 보여주고 있습니다. 문자열 또한 길이를 가지고 있기 때문에 string(글자길이) 문자열값 형태로 보여줍니다.
- ‣ 크기를 가지지 않는 경우(숫자, 불리언, null): 숫자의 경우에는 int(숫자값)과 같이 실제 숫자값이 괄호 안에 들어가 있습니다. 불리언의 경우에는 bool(불리언값) 형태로 표시되어져 있습니다. null의 경우에는 단 하나의 값 null만 가지기 때문에 따로 괄호가 필요가 없습니다. 따라서 자료형인 NULL 만 표시됩니다.
- ‣ 특징: var_dump는 유일하게 자료형을 다 보여 줍니다. 따라서 정확한 자료형을 보고자 할 때는 var_dump를 사용해야합니다.
- (2) var_export
- ‣ var_export는 자료형에 집중하는게 아니라 값에 집중하여 값들을 문자열로 출력하기 위해 만들어졌습니다. 모든 자료형들의 값들을 문자로 변환해서 보여줍니다. 이렇게 되면, 실제 문자열과 문자열이 아니였던 애들과의 구분이 불가능해지겠죠? 그래서 var_export는 재밌게도 문자열에는 작은 따옴표를 추가로 붙여서 ‘문자열값‘ 형태로 출력합니다. 출력 결과값에 작은 따옴표가 붙어있으면 문자열이고, 그 외의 경우는 다른 자료형이라는 것을 알 수가 있습니다. 아래 예제를 보면서 설명해 보겠습니다.
- [ var_export ] array ( 0 => 1, 1 => 3.14, 2 => ‘string’, 3 => ”, 4 => ‘ ‘, 5 => NULL, 6 => true, 7 => false, 8 => stdClass::__set_state(array( )), )
- ‣ 자료형에 따라 “문자 자료형“과 “그 외 다른 자료형“으로 나눠서 생각해 볼 수 있습니다.
- ‣ 문자 자료형: 문자열 string의 경우 작은 따옴표로 묶은 형태을 가지며, 출력 결과에 보면 2 => ‘string’을 확인할 수 있습니다. 여기서 2는 배열의 인덱스를 나타냅니다.
- ‣ 문자가 아닌 다른 자료형: 값들을 문자 자료형으로 변환시켜서 출력합니다. 예를 들어 숫자 1의 경우에는 문자 1로 바꾸고, NULL의 경우에는 문자 NULL로 바꿉니다. 불리언도 마찬가지입니다. 불리언 true와 false는 문자 true와 false로 출력됩니다.
- (3) print_r
- ‣ print_r은 값들을 화면에 실제로 출력하는 목적으로 만들어져 있습니다.
- [ print_r ] Array ( [0] => 1 [1] => 3.14 [2] => string [3] => [4] => [5] => [6] => 1 [7] => [8] => stdClass Object ( ) )
- ‣ 자료형에 따라 화면에 실제로 표시할 수 있는 값(숫자, 문자열)과 표시할 수 없는 값으로 나눠서 생각해 볼 수 있습니다. 또한 표시할 수 없는 값은 원시 자료형(primitive data type – null, 불리언)과 참조 자료형(reference data type – 배열, 객체)으로 나눌 수 있습니다.
- ‣ 화면에 표시할 수 있는 값: 숫자의 경우 [인덱스]=>숫자값와 같은 형태로 표시하는데, 숫자값은 사실 문자 자료형으로 변환된 상태입니다. 문자의 경우에는 [인덱스]=>문자값 형태로 표시됩니다.
- ‣ 화면에 표시할 수 없는 값 – 원시 자료형: 이 경우에는 자료형을 문자로 바꿔서 출력합니다. falsy 값인 경우 빈칸을 truthy 값인 경우에는 문자 1을 출력합니다. (재미 삼아, 자료변환을 할 때 숫자 1이 아니라 문자 1인지 어떻게 알 수 있을까요? var_dump (print_r(true, true)); 로 확인할 수 있습니다.)
- ‣ 화면에 표시할 수 없는 값 – 참조 자료형: 이 경우에는 참조 자료형태와 포함하고 있는 요소들을 보여줍니다. 예를 들어 배열의 경우 Array ([인덱스]=>출력값) 형태를 가집니다. 객체의 경우에는 stdClass Object() ([key값] => 출력값) 형태로 표시합니다.
- 목표:
[2] 차이점
[2.1] 출력이 아니라 결과값을 반환하는 기능
var_export와 print_r는 두번째 실행인자로 true를 넣게 되면, 출력기능 말고 결과값으로 반환할 수 있습니다. 아래 코드들은 결과값으로 반환된 값을 $result 변수에 넣은 예제를 보여 줍니다.
[2.1.1] var_export
|
1
2
3
4
5
6
|
<?php
// 출력값이 아니라, 결과값을 반환
$result = var_export(array(1, 3.14, ‘string’, null, true), true);
echo $result;
?>
|
[2.1.2] print_r
|
1
2
3
4
5
6
|
<?php
// 출력값이 아니라, 결과값을 반환
$result = print_r(array(1, 3.14, ‘string’, null, true), true);
echo $result;
?>
|
[2.2] 인자 갯수
var_dump는 한번에 여러 값을 동시에 체크할 수 있습니다. [2.1]에서 봤듯이 var_export와 print_r는 2번째 인자는 반환 유무에 대한 값이기 때문에 이런식으로 실행할 수 없습니다. 아래 예제는 var_dump의 출력 결과입니다.
|
1
2
3
|
<?php
var_dump(‘1’, ‘2’, ‘3’, ‘4’, ‘5’);
?>
|
[3] 결론
어떤 함수를 사용할지에 대해 최종적으로 정리를 해보겠습니다. 만약 화면 출력의 목적이 자료형 확인이면 var_dump를 사용하면 됩니다. var_dump는 모든 정보가 다 쏟아져(dump) 나와서 자세히 확인하기 좋지만, 형식이 복잡해서 가독성이 떨어지는 단점이 있습니다. 만약 가독성이 조금 향상된 결과를 보고자 한다면 print_r과 var_export가 좋은 선택입니다.
만약 자료형 확인 필요 없고 단순히 숫자와 문자의 출력만을 확인하는 것이라면 print_r을 사용하면 될 것 같습니다. print_r은 var_dump보다 출력 형식이 간단하여 가독성이 좋은 장점이 있습니다. 반면 null이나 불리언들은 빈칸 또는 1과 같이 출력되기 때문에, print_r로는 확인할 수 없습니다.
만약 가독성을 어느 정도 올리면서도, 자료형을 확인하고 싶다면, var_export가 좋은 대안이 될 것입니다. var_export는 문자열 자료형만 특별히 작은 따옴표로 감싸는 형식으로 표현합니다. 그 외의 자료형 값들은 문자열로 그대로 출력합니다. 따라서 문자열과 다른 자료형의 값들을 구분할 수가 있고, NULL과 불리언 값들도 확인이 가능합니다. 생각보다 많은 사람들이 var_export를 잘 모르고 있는데, 이 참에 한 번 var_export를 사용해보는 것은 어떨까요? 🤗




