PHP new 키워드 — 객체 생성 완전 정리
new 키워드로 User 클래스의 객체를 생성하고 변수에 저장하는 예제다. 클래스 선언이 new 아래에 위치해 있다는 점에도 주목한다.
이 파일은 객체는 생성했지만 메서드를 호출하지 않았으므로 실제로는 아무것도 출력되지 않는다. $user->print_hello() 를 추가해야 위 결과가 나온다.
new User()의 결과물이다.$user->print_hello() 처럼 쓴다.new 아래 선언해도 무방.$this->name처럼 자신의 멤버에 접근할 때 쓴다.$u2 = clone $u1은 별개의 복사본을 만들고, 단순 대입(=)은 같은 객체를 공유한다.class User { ... }는 설계도에 불과하다. 집 설계도만 가지고는 실제로 살 수 없듯이, 클래스 선언만으로는 메서드도 실행되지 않고 변수도 사용할 수 없다.
new User()를 실행하면 PHP 엔진이 메모리에 User 클래스의 구조를 갖춘 실체(객체)를 만들어낸다. 이 실체를 변수에 저장해서 사용한다.
new User() 뒤에 괄호 ()는 생성자(constructor)를 호출하는 문법이다. 이 예제처럼 생성자를 따로 정의하지 않으면 PHP가 기본 생성자를 자동으로 실행한다.new User()로 생성한 객체는 변수에 저장하지 않으면 즉시 사라진다. 변수 $user에 저장해야 이후 코드에서 같은 객체를 계속 참조할 수 있다.
변수명은 무엇이든 상관없다. $u, $myUser 등 어떤 이름이든 동일하게 동작한다. 단, 의미를 명확히 하는 이름을 사용하는 것이 좋다.
$user2 = $user처럼 대입하면 같은 객체를 두 변수가 공유하게 된다.현장에서 객체(object)와 인스턴스(instance)는 거의 같은 의미로 사용된다. 다만 강조하는 맥락이 약간 다르다.
| 용어 | 강조하는 맥락 | 예시 문장 |
|---|---|---|
| 객체 (object) | 실체 자체, 메모리의 존재 | "$user는 User 객체다" |
| 인스턴스 (instance) | 어떤 클래스에서 만들어졌는지 | "$user는 User 클래스의 인스턴스다" |
클래스는 설계도이기 때문에 같은 설계도로 건물을 여러 채 지을 수 있듯, 같은 클래스로 독립된 객체를 여러 개 생성할 수 있다. 각 객체는 별도의 멤버변수 공간을 가진다.
이 예제(user2.php)를 보면 $user = new User()가 class User { ... }보다 위에 있다. 일반적으로 선언이 먼저 와야 할 것 같지만, PHP는 이를 허용한다.
if (...) { class User { ... } } 처럼 조건문 안에 클래스를 선언하면 실행 전 파싱으로 인식되지 않아 오류가 날 수 있다. 클래스는 항상 최상위 레벨에 선언하는 것이 안전하다.객체를 생성하면 -> 연산자로 멤버변수에 접근하거나 메서드를 호출할 수 있다. 읽기와 쓰기 모두 가능하다.
public으로 선언된 멤버변수는 외부에서 자유롭게 읽고 쓸 수 있다. 하지만 외부에서 직접 변경하면 예상치 못한 버그가 생길 수 있다. 이 문제를 해결하는 것이 private + getter/setter 패턴이다.메서드 안에서 같은 객체의 멤버변수나 다른 메서드를 참조하려면 $this를 사용한다. $this는 "지금 이 메서드를 호출한 객체"를 자동으로 가리키므로, 어떤 객체가 메서드를 불렀느냐에 따라 자동으로 바뀐다.
$this는 클래스 내부 메서드에서만 유효하다. 클래스 밖에서는 $user처럼 객체 변수를 통해 접근한다. 두 객체 $a와 $b가 같은 메서드를 호출해도 각각의 $this는 다른 객체를 가리킨다.| 실수 | 증상 | 해결 |
|---|---|---|
new User (괄호 생략) |
PHP 8.0 미만에서 경고, 이후 오류 가능 | 항상 new User() 처럼 괄호를 붙일 것 |
존재하지 않는 클래스로 new |
Fatal error: Class "Xxxx" not found |
클래스가 선언되었는지, require로 불러왔는지 확인 |
$user에 저장 후 User->print_hello() |
Parse error — 클래스명으로 직접 접근 불가 | 반드시 변수(객체)를 통해 $user->print_hello() 접근 |
| 객체를 변수에 저장하지 않고 사용 | 다음 줄에서 객체를 참조할 수 없음 | $user = new User(); 처럼 변수에 저장 후 사용 |
$user2 = $user 후 $user2->name 변경 |
같은 객체를 공유하므로 $user->name도 함께 변경됨 |
독립 복사가 필요하면 $user2 = clone $user 사용 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP trait 완전 정리 — 수평상속으로 다중 기능을 조합하는 방법 (0) | 2026.07.12 |
|---|---|
| PHP 상속과 오버라이딩 완전 정리 — extends와 메서드 재정의가 작동하는 원리 (0) | 2026.07.12 |
| PHP 되돌아가기 버튼 + isset() — 다중 Submit 분기 완전 정리 (0) | 2026.07.12 |
| PHP 확인 화면 + hidden — 3단계 폼 완전 정리 (0) | 2026.07.12 |
| PHP TEXTAREA + nl2br() — 장문 입력 완전 정리 (0) | 2026.07.11 |
왕진 블로그

댓글