PHP private 멤버변수 — 외부 접근 오류 완전 정리
멤버변수에도 접근제어자를 적용할 수 있다. public $str1은 외부에서 읽기 가능하지만, private $str2는 외부에서 직접 읽으려 하면 오류가 발생한다.
Fatal error: Uncaught Error: Cannot access private property Test::$str2
$str1은 정상 출력되고, $str2 접근 시 Fatal error가 발생해 이후 코드 실행이 중단된다.
멤버변수를 모두 public으로 두면 외부 코드가 아무 값이나 직접 넣을 수 있다. 예를 들어 회원 나이 변수에 $user->age = -999를 넣어버려도 막을 방법이 없다.
private로 선언하면 외부에서 직접 변경하지 못하게 막을 수 있고, 값의 유효성을 메서드 안에서 검증해서 안전하게 저장할 수 있다.
$test->str2 = "해킹" 아무 값이나 직접 입력• 유효성 검사 우회 가능
• 객체 상태를 예측할 수 없게 됨
• 버그 추적이 어려워짐
• setter 메서드에서 유효성 검사
• 객체 상태를 클래스가 통제
• 버그 발생 지점이 명확해짐
두 멤버변수의 유일한 차이는 접근제어자다. public과 private의 외부 접근 가능 여부가 완전히 다르다.
| 변수 | 접근제어자 | 외부 읽기 | 외부 쓰기 | 클래스 내부 |
|---|---|---|---|---|
$str1 |
public | ✓ 가능 | ✓ 가능 | ✓ 가능 |
$str2 |
private | ✗ Fatal error | ✗ Fatal error | ✓ 가능 |
PHP가 발생시키는 오류 메시지를 읽는 법을 익혀두면 디버깅이 훨씬 빨라진다.
| 오류 구성 요소 | 의미 |
|---|---|
| Fatal error | 실행을 즉시 중단시키는 치명적 오류 |
| Cannot access private property | private 접근제어자가 걸린 멤버에 외부에서 접근 시도 |
| Test::$str2 | Test 클래스의 $str2 멤버변수 (클래스명::변수명 형식) |
| in ... line 13 | 오류가 발생한 파일과 줄 번호 |
Test::$str2 형식은 "Test 클래스 소속의 $str2"를 의미한다. PHP 오류 메시지에서 ::(이중 콜론)은 클래스와 멤버를 구분하는 기호다.
외부에서는 불가능하지만, 같은 클래스 안의 메서드에서는 $this->str2로 자유롭게 접근할 수 있다. 이것이 private의 핵심: "외부로부터 보호, 내부에서는 자유."
private + 공개 메서드 구조는 외부 코드가 객체의 내부 상태를 "통제된 방식으로만" 변경하게 만든다. 이것이 캡슐화(Encapsulation)다.
$user->age = -999를 막을 방법이 없다. private + setter 메서드를 쓰면 유효성 검사를 거쳐야만 값을 저장할 수 있다.이 예제(private2)는 의도적으로 오류를 보여주는 코드다. 실제 해결책은 getter 메서드를 통해 private 변수를 읽는 것이다. 자세한 구현은 private3 파일에서 다룬다.
| 접근 방식 | 코드 | 결과 |
|---|---|---|
| 직접 접근 (잘못된 방법) | print $test->str2; |
Fatal error — Cannot access private |
| getter 메서드 (올바른 방법) | print $test->getStr2(); |
정상 출력 — "비밀" |
- getter: private 변수를 읽는 public 메서드 —
getStr2() - setter: private 변수에 값을 쓰는 public 메서드 —
setStr2($v) - 이 패턴으로 외부 접근을 허용하면서도 클래스가 내부 상태를 통제한다
| 실수 | 증상 | 해결 |
|---|---|---|
private 변수에 직접 접근 ($test->str2) |
Fatal error: Cannot access private property | getter 메서드 getStr2()를 통해 간접 접근 |
private 변수를 직접 수정 ($test->str2 = '값') |
Fatal error: Cannot access private property | setter 메서드 setStr2('값')를 통해 간접 수정 |
| 오류 발생 후 이후 print 실행될 것으로 착각 | Fatal error 이후 모든 코드 중단 | try/catch 예외 처리 또는 private 변수 직접 접근 시도 자체를 제거 |
| 모든 멤버변수를 public으로 선언 | 외부에서 임의 값 삽입 가능 — 데이터 오염 | 기본적으로 private 선언, 필요한 것만 getter/setter 공개 |
| 자식 클래스에서 부모의 private 변수 접근 시도 | Fatal error: Cannot access private property | 자식에서도 쓸 변수는 protected로 선언 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP 이터레이터 패턴 완전 정리 — Member 컬렉션을 foreach로 순회하는 실전 코드 (0) | 2026.07.08 |
|---|---|
| PHP getter 메서드 — private 변수 안전 접근 완전 정리 (0) | 2026.07.08 |
| PHP 객체 메서드 호출 — 클래스 전체 흐름 완전 정리 (0) | 2026.07.08 |
| PHP class 키워드 — 클래스 선언 완전 정리 (1) | 2026.07.08 |
| PHP 라디오버튼 — 단일 선택값 처리 완전 정리 (0) | 2026.07.08 |
왕진 블로그

댓글