namespace는 PHP 코드를 조직하고 클래스, 함수, 상수 간의 이름 충돌을 방지합니다 — 애플리케이션이 커지고 서드파티 패키지를 사용할 때 필수적입니다. 클래스 이름을 위한 디렉터리처럼 동작하며, Composer 오토로딩(PSR-4)과 통합됩니다.
namespace가 해결하는 문제
namespace가 없으면, 두 개의 `User` 클래스(내 것과 라이브러리의 것)가 충돌함
("클래스를 재선언할 수 없음"). namespace는 각각에게 고유한 정규화된 이름을 부여.
namespace 선언하고 사용하기
<?php
// 파일 최상단에 namespace 선언 (디렉터리와 일치, PSR-4)
namespace App\Models;
class User { // 정규화된 이름: App\Models\User
// ...
}
<?php
namespace App\Controllers;
use App\Models\User; // 짧은 이름을 쓸 수 있도록 클래스를 import
use App\Services\Mailer as MailService; // 별칭과 함께 import
class UserController {
public function index() {
$user = new User(); // use import 덕분에 짧은 이름이 동작
// 또는 정규화된 이름 사용: new \App\Models\User();
}
}
파일은 자신의 namespace를 선언하고, 다른 파일은 클래스를 use(import)하여 짧은 이름으로 참조합니다. 정규화된 이름(\App\Models\User)은 전역적으로 고유합니다.
namespace는 디렉터리에 매핑됨 (PSR-4)
namespace 파일 경로
App\Models\User → src/Models/User.php
App\Services\Mailer → src/Services/Mailer.php
→ PSR-4 오토로딩: namespace 구조가 폴더 구조를 반영하여,
Composer가 각 클래스를 자동으로 찾아 로드할 수 있음 (수동 require 불필요).
함수, 상수, 전역 namespace import
use function App\Helpers\format; // 함수 import
use const App\Config\VERSION; // 상수 import
\strlen("x"); // 선행 \ = 전역 namespace (내장 함수)
왜 중요한가
namespace는 현대 PHP 코드를 조직하는 데 필수적이며 전체 생태계가 동작하는 방식의 근간입니다.
이를 이해하는 것이 중요한 이유는 이름 충돌이라는 결정적 문제를 해결하기 때문입니다 — namespace가 없으면 클래스가 서로 충돌하고 실제 애플리케이션이 사용하는 수많은 서드파티 패키지와도 충돌하여(두 User 클래스가 공존할 수 없음) 대규모 애플리케이션과 패키지 생태계가 불가능해집니다.
namespace는 모든 클래스에 고유한 정규화된 이름을 부여하고, use import는 클래스를 짧은 이름으로 깔끔하게 참조하게 합니다.
무엇보다 namespace는 PSR-4를 통한 Composer 오토로딩과 통합되어, namespace 구조가 디렉터리 구조를 반영함으로써 클래스가 필요할 때 자동으로 로드됩니다 — 이것이 현대 PHP 프로젝트 구조와 의존성 관리의 토대입니다.
모든 현대 PHP 프레임워크, 패키지, 애플리케이션이 namespace로 조직되므로(그리고 namespace를 이해하지 않고는 Composer 패키지를 사용할 수 없으므로), namespace를 선언하고, use로 클래스를 import하고, 오토로딩을 위해 디렉터리에 매핑되는 법을 아는 것은 모든 현대 PHP 개발의 기초적인 일상 지식입니다.
namespace, Composer, PSR-4 오토로딩은 함께 현대 PHP 프로젝트가 어떻게 구조화되는지를 정의합니다.
