네임스페이스 소개
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 10번째.
PHP 프로젝트가 커짐에 따라 많은 클래스를 생성하게 될 것입니다. 두 클래스의 이름이 같으면 어떻게 될까요?
예를 들어, 블로그를 위한 User 클래스와 상점을 위한 또 다른 User 클래스가 있을 수 있습니다. 네임스페이스는 클래스들을 논리적인 그룹으로 조직하여 이 문제를 해결합니다.
네임스페이스는 클래스를 위한 폴더와 같습니다. PHP 파일의 상단에서 namespace 키워드를 사용하여 선언합니다:
<?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;
}
}
네임스페이스가 지정된 클래스를 사용하려면 백슬래시를 사용하여 전체 경로로 참조합니다:
<?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
백슬래시 \는 파일 경로에서 슬래시가 폴더를 구분하는 방식과 유사하게 네임스페이스 수준을 구분합니다. 또한 더 체계적인 구조를 위해 App\Models\Blog와 같이 중첩된 네임스페이스를 만들 수도 있습니다.
핵심 포인트: 네임스페이스는 이름 충돌을 방지하고 코드를 체계적으로 유지해 줍니다. 파일 내의 다른 코드보다 먼저 네임스페이스를 선언하십시오 (declare 문은 제외).
챌린지
쉬움동일한 이름을 가진 클래스 간의 이름 충돌을 방지하기 위해 네임스페이스를 사용하여 작은 애플리케이션을 구성해 보겠습니다.
차량(vehicles)과 동물(animals)을 모두 다루는 시스템을 구축한다고 가정해 보세요. 두 도메인 모두 Car라는 엔티티를 가지고 있습니다. 하나는 실제 자동차를 나타내고, 다른 하나는 이름이 "Car"인 애완용 고양이입니다 (네, 실제로 고양이 이름을 그렇게 짓는 사람들도 있습니다!).
세 개의 파일을 생성하게 됩니다:
Vehicle/Car.php—Vehicle네임스페이스 안에public $brand속성을 가진Car클래스를 정의합니다. 생성자는 브랜드 이름을 받아 설정해야 합니다."Vehicle: [brand]"를 반환하는describe()메서드를 추가하세요.Animal/Car.php—Animal네임스페이스 안에Car클래스를 정의합니다 (이것은 이름이 Car인 고양이입니다!).public $age속성을 가져야 합니다. 생성자는 나이를 받아 설정합니다."Cat named Car, age: [age]"를 반환하는describe()메서드를 추가하세요.main.php—require_once를 사용하여 두 클래스 파일을 모두 포함합니다. 전체 네임스페이스 경로를 사용하여 각 네임스페이스에서 객체를 하나씩 생성한 다음, 각 객체에서describe()를 호출한 결과를 출력하세요 (각각 별도의 줄에 출력).
main.php에서 다음을 생성하세요:
- 브랜드가
"Toyota"인Vehicle\Car - 나이가
3인Animal\Car
객체를 생성할 때 전체 경로와 함께 백슬래시 \를 사용하여 네임스페이스가 지정된 클래스를 참조해야 함을 기억하세요.
치트 시트
네임스페이스는 클래스를 논리적인 그룹으로 구성하고, 여러 클래스가 동일한 이름을 공유할 때 발생하는 이름 충돌을 방지합니다.
PHP 파일 상단에서 namespace 키워드를 사용하여 네임스페이스를 선언합니다:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
서로 다른 네임스페이스에 동일한 이름을 가진 클래스를 가질 수 있습니다:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
네임스페이스가 지정된 클래스를 사용하려면 백슬래시 \를 사용하여 전체 경로로 참조하세요:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
백슬래시는 폴더 경로와 유사하게 네임스페이스 수준을 구분합니다. App\Models\Blog와 같이 중첩된 네임스페이스를 만들 수 있습니다.
중요: 네임스페이스는 항상 파일의 다른 코드(declare 문 제외)보다 먼저 선언해야 합니다.
직접 해보기
<?php
// 클래스 파일 포함
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: 브랜드가 "Toyota"인 Vehicle\Car 객체 생성
// 백슬래시를 포함한 전체 네임스페이스 경로를 사용해야 함을 기억하세요.
// TODO: 나이가 3인 Animal\Car 객체 생성
// 백슬래시를 포함한 전체 네임스페이스 경로를 사용해야 함을 기억하세요.
// TODO: 각 객체의 describe() 결과를 출력 (각각 별도의 줄에 출력)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션