변수 기본
변수 기본 (Basics)
PHP의 변수는 달러 기호($)로 시작하는 이름으로 표현돼요. 이 페이지에서는 유효한 변수 이름의 규칙, 값에 의한 할당과 참조에 의한 할당의 차이, 그리고 미정의 변수를 다루는 방법을 설명해요.
본문
PHP의 변수는 달러 기호($)와 변수 이름으로 표현돼요. 변수 이름은 대소문자를 구분해요.
유효한 변수 이름은 문자(A-Z, a-z, 또는 128부터 255까지의 바이트)나 밑줄(_)로 시작하고, 그 뒤에는 문자, 숫자, 밑줄이 몇 개든 따라올 수 있어요. 정규 표현식으로 표현하면 다음과 같아요:
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
참고: 변수 이름은 문자(characters)가 아닌 바이트(bytes)로 비교돼요. PHP는 128부터 255까지의 바이트 인코딩을 해석하거나 검증하지 않으며, 두 이름이 같은 변수를 가리키는 것은 바이트가 완전히 동일할 때뿐이에요.
그 결과 중 하나는 UTF-8로 작성된 이름이 잘 작동한다는 점이에요. UTF-8 다중 바이트 시퀀스의 모든 바이트가 허용 범위 안에 들어오기 때문이에요. 이것은 비-ASCII 바이트가 모두 그 범위에 들어오는 어떤 인코딩에도, 그리고 어떤 인코딩의 유효한 텍스트도 아닌 바이트 시퀀스에도 마찬가지로 적용돼요. 다중 바이트 시퀀스 안에서 128 미만의 바이트를 사용하는 인코딩(Shift-JIS나 UTF-16 등)은 그렇지 않아요.
또 다른 결과는 동일하게 보이는 두 이름이 서로 다를 수 있다는 점이에요. U+00E4로 인코딩된
ä와 결합 분음 부호(diaeresis) U+0308이 뒤따르는a는 서로 다른 변수이며, 끝에 U+00A0 NO-BREAK SPACE가 있는 이름과 없는 이름도 서로 달라요.
참고:
$this는 할당할 수 없는 특별한 변수예요. PHP 7.1.0 이전에는 변수 변수를 사용하는 간접 할당이 가능했어요.
팁: 사용자 영역 명명 가이드 (Userland Naming Guide)도 함께 참고해요.
예제 #1 유효한 변수 이름
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // outputs "Bob, Joe"
$_4site = 'not yet'; // valid; starts with an underscore
$täyte = 'mansikka'; // valid; 'ä' is (Extended) ASCII 228.
예제 #2 잘못된 변수 이름
<?php
$4site = 'not yet'; // invalid; starts with a number
PHP는 임의의 바이트 시퀀스를 변수 이름으로 받아들여요. 위에서 언급한 명명 규칙을 따르지 않는 변수 이름은 런타임에 동적으로만 접근할 수 있어요. 접근 방법은 변수 변수 문서를 참고해요.
예제 #3 다루기 어려운 변수 이름 접근
<?php
${'invalid-name'} = 'bar';
$name = 'invalid-name';
echo ${'invalid-name'}, " ", $$name;
위 예제의 출력:
bar bar
기본적으로 변수는 항상 값에 의해 할당돼요. 즉, 표현식을 변수에 할당하면 원래 표현식의 전체 값이 대상 변수에 복사돼요. 예를 들어 한 변수의 값을 다른 변수에 할당한 후, 그중 하나를 바꿔도 다른 하나에는 영향을 주지 않아요. 이런 종류의 할당에 대한 자세한 내용은 표현식 (Expressions) 챕터를 참고해요.
PHP는 변수에 값을 할당하는 또 다른 방법도 제공해요: 참조에 의한 할당(assign by reference)이에요. 이는 새 변수가 단순히 원래 변수를 참조한다는(다시 말해 "그 변수의 별칭이 되거나" "그 변수를 가리키는") 뜻이에요. 새 변수의 변경은 원래 변수에도 영향을 주고, 그 반대도 마찬가지예요.
참조에 의한 할당을 하려면 할당할(원본) 변수의 시작 부분에 앰퍼샌드(&)를 붙이면 돼요. 예를 들어 다음 코드 스니펫은 'My name is Bob'을 두 번 출력해요:
<?php
$foo = 'Bob'; // Assign the value 'Bob' to $foo
$bar = &$foo; // Reference $foo via $bar.
$bar = "My name is $bar"; // Alter $bar...
echo $bar . PHP_EOL;
echo $foo . PHP_EOL; // $foo is altered too.
중요한 점 하나는 참조에 의한 할당은 변수에만 가능하다는 거예요.
<?php
$original = 25;
$ref1 = &$original; // This is a valid assignment.
$ref2 = &(24 * 7); // Invalid; references an unnamed expression.
<?php
// Note the lack of & indicating a returned reference in the function declaration.
// i.e. the function does not return a reference, so the result cannot be assigned by reference
function test()
{
$original = 25;
return $original;
}
// Note: A notice is issued, but the non-reference value is assigned
$result1 = &test(); // Invalid because test() doesn't return a variable by reference.
var_dump($result1);
// This function is defined as returning a reference, but does not return a variable
function &test2()
{
return 26; // Invalid because the returned value isn't a variable reference.
}
// Note: The non-reference value is assigned
$result2 = &test2();
var_dump($result2);
PHP에서 변수를 선언할 필요는 없지만, 선언하는 것은 매우 좋은 관례예요. 정의되지 않은 변수에 접근하면 E_WARNING(PHP 8.0.0 이전에는 E_NOTICE)이 발생해요. 정의되지 않은 변수의 기본값은 null이에요. isset() 언어 구조를 사용해서 변수가 이미 초기화됐는지 감지할 수 있어요.
예제 #4 초기화되지 않은 변수의 기본값
<?php
// Unset AND unreferenced (no use context) variable.
var_dump($unset_var);
위 예제의 출력:
Warning: Undefined variable $unset_var in ...
NULL
PHP는 정의되지 않은 변수에서 배열 자동 생성(autovivification, 새 배열의 자동 생성)을 허용해요. 정의되지 않은 변수에 요소를 추가하면 새 배열이 만들어지고 경고가 발생하지 않아요.
예제 #5 정의되지 않은 변수에서 배열 자동 생성
<?php
$unset_array[] = 'value'; // Does not generate a warning.
var_dump($unset_array);
경고: 다른 파일을 포함할 때 같은 변수 이름을 사용한다면, 초기화되지 않은 변수의 기본값에 의존하는 것은 문제가 될 수 있어요.
변수는 unset() 언어 구조로 파괴할 수 있어요.
변수 관련 함수에 대한 정보는 변수 함수 레퍼런스 (Variable Functions Reference)를 참고해요.