PHP 변수는 $로 시작하는 이름이며, 값을 대입해서 만듭니다: $name = "Ada";. 값이 타입을 결정하므로 선언 키워드도, 명시할 타입도 없습니다. 나중에 다른 타입의 값을 대입해도 됩니다.
변수 이름 규칙
변수 이름은 $로 시작하고, 그다음 문자나 밑줄, 그 뒤로 문자, 숫자, 밑줄이 옵니다. ASCII가 아닌 문자도 문자로 취급되므로 $名前도 유효하지만, 보통은 ASCII 이름을 씁니다. 이름은 대소문자를 구분합니다.
| 이름 | 유효한가? |
|---|---|
$total, $userName, $user_name | 예 |
$_count, $item2 | 예 |
$2items | 아니요, 숫자로 시작할 수 없음 |
$user-name | 아니요, $user 빼기 name이 됨 |
$this | 아니요, 현재 객체용으로 예약됨. 대입하면 치명적 에러 |
따라서 $city, $City, $CITY는 서로 다른 세 변수입니다. snake_case($first_name)나 camelCase($firstName)를 쓰고, 프로젝트마다 한 가지 스타일을 유지하세요. PSR 코딩 표준은 변수 이름 규칙을 일부러 정하지 않았고, Laravel과 Symfony 코드는 대부분 camelCase를 씁니다.
문자열 안에서 변수 사용
큰따옴표 안에서는 PHP가 변수를 값으로 바꾸고, 작은따옴표 안에서는 바꾸지 않습니다. 변수 바로 뒤에 문자가 오거나 문자열 키로 배열 요소에 접근할 때는 변수를 중괄호로 감싸세요.
따옴표, 연결, 보간은 문자열 페이지에서 자세히 다룹니다.
정의되지 않은 변수와 기본값
대입된 적 없는 변수를 읽으면 null이 되고, 내 PHP에서는 경고가 출력됩니다.
Warning: Undefined variable $discount in /home/index.php on line 3
먼저 isset으로 확인하거나, null 병합 연산자 ??로 기본값을 주세요. 둘 다 경고 없이 실행됩니다.
$x ??= 0;은 $x = $x ?? 0;의 짧은 형태입니다. 폼과 URL 값이 대표적인 경우입니다: $page = $_GET['page'] ?? 1;.
함수 안의 변수 스코프
함수 밖에서 정의한 변수는 함수 안에서 보이지 않고, 함수 안에서 만든 변수는 함수가 반환되면 사라집니다. JavaScript에서 온 사람들이 가장 많이 놀라는 부분입니다.
?? 0이 없으면 첫 번째 함수는 정의되지 않은 $taxRate에 대해 경고합니다. 값을 매개변수로 전달하면 함수가 예측 가능하고 테스트하기 쉬워지며, 가장 먼저 선택해야 할 방법입니다. 매개변수와 반환값은 함수 페이지에서 다룹니다.
global 키워드와 $GLOBALS
함수가 정말로 전역 변수를 써야 한다면 global로 선언하거나, 모든 전역 변수를 이름으로 담고 있는 $GLOBALS 배열을 거치세요.
전역 변수는 어떤 함수든 바꿀 수 있어서 코드를 따라가기 어렵게 만듭니다. 오래된 코드와 WordPress 플러그인에 등장하며(global $wpdb;), 새 코드에서는 값을 전달하거나 클래스를 쓰세요.
static 변수는 값을 유지한다
함수 안의 static 변수는 한 번 만들어지고 호출 사이에 값을 유지합니다. 여전히 지역 변수이므로 함수 밖의 코드는 볼 수 없습니다.
가변 변수($$name)
$$name은 $name의 값을 다른 변수의 이름으로 사용합니다. 동작은 하지만, 거의 언제나 배열이 같은 일을 더 명확하게 합니다.
<?php
$field = "color";
$$field = "blue"; // creates $color
echo $color, "\n";
// The clearer way to have names chosen at runtime:
$settings = [];
$settings[$field] = "blue";
echo $settings["color"], "\n";
복사와 참조
변수를 다른 변수에 대입하면 값이 복사되며, 배열도 마찬가지입니다. 앞에 &를 붙이면 두 이름이 같은 값을 가리키게 됩니다.
객체는 다르게 동작합니다. 객체를 대입하면 같은 객체에 대한 핸들이 복사되므로, 어느 변수로 바꾸든 양쪽에서 변경이 보입니다. 진짜 복사본이 필요하면 clone을 쓰세요.
흔한 실수: if나 반복문 안에서 설정한 변수
PHP에는 블록 스코프가 없으므로 if, for, foreach 안에서 만든 변수는 그 뒤에도 존재합니다. 편리하지만 버그를 숨깁니다. 블록이 실행되지 않으면 변수는 만들어지지 않은 것입니다.
기본값 줄이 없으면 $orders가 비어 있을 때 $message가 정의되지 않아 경고가 출력됩니다. 값을 설정할 수도 있는 블록 앞에서 모든 변수에 값을 주세요.
자주 묻는 질문
PHP에서 변수는 어떻게 선언하나요?
$로 시작하는 이름에 값을 대입합니다: $count = 10;. PHP에는 var나 let 키워드가 없고 선언에 타입도 없습니다. 변수는 처음 대입할 때 만들어지고 값의 타입을 따릅니다.
함수가 바깥에서 정의한 변수를 못 보는 이유는?
PHP 함수는 자체 지역 스코프를 가지며 전역 변수를 자동으로 보지 않습니다. 값을 매개변수로 전달하거나(깔끔한 방법), 함수 안에서 global $name;을 선언하거나, $GLOBALS['name']을 읽으세요. 클로저는 use ($name)으로 캡처할 수 있고, 화살표 함수 fn()은 자동으로 캡처합니다.
PHP의 static 변수란 무엇인가요?
함수 안에서 static $calls = 0;처럼 static으로 선언한 지역 변수입니다. 한 번만 초기화되고 그 함수의 호출 사이에 값을 유지하므로 카운터나 간단한 캐시에 유용합니다.
PHP 변수 이름은 대소문자를 구분하나요?
네. $name, $Name, $NAME은 서로 다른 세 변수입니다. 반면 함수와 클래스 이름은 PHP에서 대소문자를 구분하지 않습니다.
PHP에서 변수를 삭제하려면 어떻게 하나요?
unset($name);을 호출하세요. 그 뒤에는 isset($name)이 false이고, 읽으면 "Undefined variable" 경고가 나옵니다. null을 대입하면 변수는 남고 값만 비워집니다.