1. [비밀 공개] 왜 PHP는 달러($) 기호를 사용할까?
역사적 배경: "멈추는 방법을 몰랐던" 창시자의 여정
PHP의 창시자 라스무스 러도프(Rasmus Lerdorf)는 1994년, 자신의 온라인 이력서 방문자를 추적하기 위해 Perl로 작성된 CGI 도구를 만들기 시작했습니다. 이후 성능 개선을 위해 C언어로 재작성하면서 PHP 2.0/FI(Form Interpreter)로 발전했는데, 이때 기존 개발자들이 익숙했던 Perl의 문법을 의도적으로 차용했습니다.
그는 훗날 자신의 회고록에서 이렇게 말했습니다.
"저는 프로그래밍 언어를 작성할 의도가 전혀 없었지만, 이것을 멈추는 방법을 몰랐습니다. [...] 저는 프로그래밍 언어를 작성하는 방법을 전혀 모릅니다. 저는 그저 계속해서 다음 논리적 단계를 추가했습니다."
이처럼 PHP는 정교한 설계보다는 실용적인 필요에 의해 탄생했고, 그 과정에서 Perl의 유산인 $ 기호가 변수의 상징으로 정착되었습니다.
기호의 실무적 의미: 파서(Parser)를 위한 힌트
PHP에서 $ 기호는 단순한 식별자가 아닙니다. 엔진의 파서가 코드 내에서 변수를 즉각적으로 찾아낼 수 있게 돕는 힌트 역할을 합니다. 덕분에 PHP는 자바스크립트나 자바와 달리, 큰따옴표(" ")로 감싸인 문자열 내부에 변수를 직접 삽입하여 처리할 수 있는 강력한 유연성을 갖게 되었습니다.
--------------------------------------------------------------------------------
2. PHP 변수 선언: 반드시 지켜야 할 5가지 황금 규칙
우아한 코딩의 시작은 규칙 준수입니다. 시니어 개발자로서 강조하는 변수 명명 규칙 5가지를 정리해 드립니다.
1. 구성 요소: 영문 대소문자, 숫자, 언더스코어(_)만 허용됩니다.
2. 숫자 시작 금지: 변수 이름은 숫자로 시작할 수 없습니다. 이는 렉서(Lexer)가 숫자 리터럴과 변수 식별자를 즉각적으로 구분하게 함으로써 분석 성능을 높이기 위함입니다.
3. 공백 및 특수문자 금지: $ _를 제외한 특수문자 및 빈칸은 사용할 수 없습니다.
4. 대소문자 구분: PHP 변수는 대소문자를 엄격히 구분합니다. $User $user는 별개의 메모리 공간을 차지합니다.
5. 예약어 $this 사용 금지: 객체 지향 프로그래밍에서 자기 자신을 가리키는 특수 변수 $this는 사용자 정의 변수로 사용할 수 없습니다.
💡 시니어의 팁: 문자열 내 중괄호({ })의 마법 문자열 내에서 변수를 쓸 때, 변수명 바로 뒤에 문자가 붙어 있으면 파서가 변수 범위를 혼동합니다. echo "The {$color}ish sky";와 같이 중괄호를 사용하면 어디까지가 변수명인지 명확히 명시할 수 있어 오류를 방지하고 가독성을 높입니다.
--------------------------------------------------------------------------------
3. PHP의 8가지 기본 데이터 타입(Data Types) 집중 분석
PHP는 상황에 따라 타입을 스스로 결정하는 동적 타이핑 언어이지만, 내부적으로는 8가지 타입을 엄격히 구분합니다.
데이터 타입 요약표

카테고리데이터 타입특징

스칼라 (Scalar)
boolean, integer, float, string
단일 값을 저장하는 기본 타입
복합 (Compound)
array, object
여러 데이터의 집합
특수 (Special)
resource, NULL
외부 자원이나 빈 값을 표현
핵심 타입별 주의사항
 불리언(boolean): false로 인식되는 값들을 정확히 숙지해야 합니다. false, 정수 0, 실수 0.0, 빈 문자열 "", 문자열 "0", 빈 배열, NULL이 이에 해당합니다.
    ◦ 함정 경보: 문자열 "false"는 불리언으로 변환 시 **true**가 됩니다. 이는 입문자가 가장 많이 하는 실수 중 하나입니다.
 정수(integer): PHP는 부호 없는 정수(unsigned integer)를 지원하지 않습니다. 64비트 시스템 기준 범위를 넘어가면 자동으로 실수(float)로 변환됩니다.
 문자열(string): UTF-8 환경에서 한글은 한 글자당 3바이트를 차지합니다. strlen("한글")의 결과가 6인 이유를 기억하세요.
 배열(array): 내부적으로 해시 테이블 기반의 맵(Map)으로 동작합니다.
    ◦ 키 변환 규칙: 키를 지정할 때 "8"과 같은 10진수 문자열은 정수 8로 자동 변환되지만, "08"처럼 0으로 시작하는 문자열은 그대로 문자열로 남습니다. 또한 실수는 소수점이 버려지고 정수로 변환됩니다.
--------------------------------------------------------------------------------
4. 유연함의 미학: 타입 변환(Type Juggling & Casting)
 자동 타입 변환(Type Juggling): 대입되는 값에 따라 타입이 자동으로 결정됩니다.
 강제 타입 변환(Type Casting): (int), (boolean) 등 괄호 연산자를 사용하여 명시적으로 변환합니다.
 데이터 확인: var_dump()는 타입, 길이, 값을 상세히 보여주며, gettype()은 단순 타입 이름만 반환합니다.
--------------------------------------------------------------------------------
5. 심화 학습: 가변 변수()와 참조 변수(&)
가변 변수 (Variable Variables)
변수의 값을 또 다른 변수의 이름으로 취급합니다.
$original = "1234";
$change = "original";
echo $$change; // $original의 값인 1234 출력
시니어의 조언: $$ 문법은 동적 로직에 유용하지만, 남용하면 디버깅이 불가능한 '나쁜 코드(Code Smell)'가 될 위험이 큽니다. 현대적인 OOP에서는 가급적 피하는 것이 상책입니다.
참조 변수 (Reference Variables)
& 기호를 통해 두 변수가 동일한 메모리 주소를 공유하게 합니다.
 unset()의 진실: 참조 변수에 unset()을 호출하면 변수 이름과 값 사이의 연결만 끊깁니다. 값이 메모리에서 즉시 삭제되는 것이 아니며, 다른 이름의 참조가 남아 있다면 값은 유지됩니다.
--------------------------------------------------------------------------------
6. 변수의 범위: 글로벌(Global) vs 로컬(Local)
 로컬 변수: 함수 내부에서 선언되며 종료 시 소멸합니다.
 글로벌 변수: 함수 외부에서 선언되며 스크립트 전체에서 유효합니다. 함수 내부에서 접근하려면 global 키워드 선언이나 $GLOBALS 배열이 필수입니다.
 슈퍼글로벌: $_GET, $_POST 등 PHP가 미리 정의한 배열로, 어디서든 즉시 접근 가능합니다.
--------------------------------------------------------------------------------
7. PHP 8.0 시대: 더 엄격하고 강력해진 변수 관리
최신 PHP 8.0 환경에서는 유연함보다는 안정성이 강조됩니다.
1. 경고에서 에러로: 과거에는 선언되지 않은 변수를 사용하면 경고(Warning)만 떴으나, 이제는 **치명적 에러(Fatal Error/Exception)**가 발생하여 스크립트가 중단됩니다. isset() 체크가 이제는 선택이 아닌 필수입니다.
2. 생성자 속성 승격(Constructor Property Promotion): 생성자 매개변수에서 바로 속성을 선언하고 초기화할 수 있어 코드가 획기적으로 줄어듭니다.
3. 유니온 타입(Union Types): int|float와 같이 여러 타입을 동시에 허용하는 선언이 가능해졌습니다.
4. 최신 연산자: Nullsafe 연산자(?->)와 Match 표현식은 null 체크와 조건부 대입을 훨씬 간결하고 안전하게 만들어 줍니다.
--------------------------------------------------------------------------------
마무리: 기초가 탄탄한 PHP 개발자가 되는 법
PHP 변수와 데이터 타입을 이해하는 것은 집의 기초 공사와 같습니다. 언어의 역사와 내부 동작 원리를 이해하는 개발자는 어떤 복잡한 비즈니스 로직 앞에서도 당황하지 않습니다.
✅ 핵심 요약 체크리스트
 [ ] 변수 선언 시 $ 기호를 잊지 않았는가?
 [ ] 숫자로 시작하거나 특수문자가 섞인 변수명은 없는가?
 [ ] 문자열 "0"이 불리언 **false**라는 사실을 인지했는가?
 [ ] UTF-8 한글 문자열 처리를 위해 3바이트를 고려했는가?
 [ ] unset()이 참조 변수의 '연결'만 끊는다는 사실을 이해했는가?
 [ ] PHP 8 환경에서 변수 미선언 시 발생할 치명적 에러에 대비했는가?

+ Recent posts