네임스페이스 소개
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 10번째.
PHP 프로젝트가 커지면 많은 클래스를 만들게 됩니다. 두 클래스의 이름이 같으면 어떻게 될까요?
예를 들어, 블로그에 User 클래스가 있고 상점에 또 다른 User 클래스가 있을 수 있습니다. 네임스페이스는 클래스를 논리적 그룹으로 구성하여 이 문제를 해결합니다.
네임스페이스는 클래스를 위한 폴더와 같습니다. namespace 키워드를 사용하여 PHP 파일의 맨 위에 선언합니다:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
이제 다른 네임스페이스에 또 다른 User 클래스를 사용할 수 있습니다:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
네임스페이스가 지정된 class를 사용하려면 backslash를 사용하여 its full path로 참조합니다:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
출력:
Alice
alice@example.com
backslash는 namespace 수준을 구분하며, 파일 path에서 슬래시가 폴더를 구분하는 방식과 비슷합니다. 더 세분화된 구성을 위해 App\Models\Blog과 같은 중첩된 namespace도 만들 수 있습니다.
핵심 사항: namespace는 이름 충돌을 방지하고 코드를 체계적으로 유지합니다. 파일의 다른 코드보다 먼저 namespace를 항상 선언하세요(declare 문은 예외).
챌린지
쉬움같은 이름을 가진 클래스 간의 이름 충돌을 방지하기 위해 네임스페이스를 사용하여 작은 애플리케이션을 구성해 보겠습니다.
차량과 동물을 모두 처리하는 시스템을 만든다고 상상해 보세요. 두 도메인 모두 Car라는 엔티티를 가지고 있습니다. 하나는 실제 자동차를 나타내고, 다른 하나는 "Car"라는 이름의 반려 고양이입니다(네, 실제로 고양이에게 그렇게 이름을 짓는 사람들도 있습니다!).
세 개의 파일을 만들 것입니다.
Vehicle/Car.php:Vehiclenamespace 안에Carclass를 정의하고public $brandproperty를 추가합니다. constructor는 브랜드 이름을 받아 저장해야 합니다.describe()method를 추가하여"Vehicle: [brand]"를 반환하도록 합니다.Animal/Car.php:Animalnamespace 안에Carclass를 정의합니다(이것은 Car라는 이름의 고양이입니다!).public $ageproperty를 가져야 합니다. constructor는 나이를 받아 저장합니다.describe()method를 추가하여"Cat named Car, age: [age]"를 반환하도록 합니다.main.php:require_once를 사용하여 두 class 파일을 모두 Include합니다. 각 namespace에서 full namespace path를 사용하여 하나씩 object를 만들고, 각 object에서describe()를 호출한 result를 출력합니다(각 result는 자체 line에 출력).
main.php에서 다음을 만드세요.
- brand가
"Toyota"인Vehicle\Car - age가
3인Animal\Car
object를 만들 때 full path를 사용하여 namespace가 지정된 class를 참조하려면 backslash \를 사용해야 한다는 점을 Remember하세요.
직접 해보기
<?php
// 클래스 파일 포함
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: 브랜드 "Toyota"인 Vehicle\Car 객체 생성
// 백슬래시와 함께 전체 네임스페이스 경로를 사용하세요
// TODO: 나이가 3인 Animal\Car 객체 생성
// 백슬래시와 함께 전체 네임스페이스 경로를 사용하세요
// TODO: 각 객체의 describe() 결과를 출력 (각각 한 줄에)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러