- namespace 가 필요한 상황 -
Hello() 라는 이름으로 클래스를 만들려고 한다.
물론 이름이 겹치지 않도록 하는 게 일단 가장 좋겠지만,
똑같은 이름으로 여러 클래스가 존재할 수도 있다.
아래는 예시다.
class Hello {
function __construct() {
echo '안녕하세요. 환영합니다.';
}
}
class Hello {
function __construct() {
echo 'Nice to meet you. Welcome.';
}
}
%obj = new Hello();
만약 이렇게 실행하면 어떤 쪽이 실행될까?.
똑같은 이름으로 Hello 클래스가 두 개 존재하는데,
Hello 인스턴스를 만들면 누구를 만들게 될까?
- namespace 의미와 쓰는 이유 -
이런 경우를 대비해서 바구니를 만들 수 있다.
이름이 똑같은 클래스라도 서로 다른 바구니에 담아 두면 된다.
그리고 그 바구니에 이름을 붙인다.
클래스를 부를 때는, 이제 그 바구니를 함께 말하면 된다.
그럼 똑같은 이름을 가지는 클래스라도 헷갈리지 않는다.
A 바구니에 담긴 Hello 주세요.
B 바구니에 담아 놓은 Hello 주세요.
이런 식으로 달라고 하면 된다.
여기서 바구니 역할을 하는 게 'namespace'다.
그리고 그 바구니를 부르는 방법은 'use'다.
아래에서 예시를 보자.
namespace ko;
class Hello {
function __construct() {
echo '안녕하세요. 환영합니다.';
}
}
namespace en;
class Hello {
function __construct() {
echo 'Nice to meet you. Welcome.';
}
}
- use 의 의미와 사용법 -
앞에서 'namespace'가 클래스들을 담는 바구니 역할을 한다고 했다.
그리고 그 바구니를 부르는 방법은 'use'다.
위를 보면, 똑같이 'Hello'라는 이름으로 클래스를 두 개 만들었다.
하지만 'namespace' 다르다.
하나는 'ko'에 담았고,
다른 하나는 'en'에 담았다.
꺼내올 때는 어떻게 하면 될까?
아래를 보자.
use en;
$obj1 = new en\Hello();
use ko;
$obj2 = new ko\Hello();
'use'를 먼저 말하면,
어떤 'namespace'에서 꺼내오고 싶은지 알려준다.
아니면 아래처럼 'use'를 쓰지 않고
클래스 이름 앞에 바로 붙일 수도 있다.
$obj1 = new \en\Hello();
$obj2 = new \ko\Hello();
- use 를 쓰는 이유 -
그럼 굳이 'use'를 쓰는 이유는 무엇일까?
그냥 namespace를 그때그때 클래스 앞에다가 붙이면
헷갈릴 일도 없고 더 좋지 않을까?
여기서 계층을 더 깊게 나누게 되면 장점이 바로 보인다.
폴더 안에 폴더를 만드는 것과 비슷하다.
큰 바구니 안에 작은 바구니를 넣어 두는 것이다.
넣는 법은, namespace 똑같이 쓰고 그 뒤에 계층을 경로로 붙인다.
아래는 예시다.
namespace greeting\en;
class Hello{ ~~~~ }
namespace greeting\ko;
class Hello{ ~~~~ }
use greeting\en;
$obj1 = new en\Hello();
use greeting\ko;
$obj2 = new ko\Hello();
마찬가지로 'use'를 쓰지 않고
클래스에 바로 경로를 붙여서 부를 수도 있다.
$obj1 = new \greeting\en\Hello();
$obj2 = new \greeting\ko\Hello();
이렇게 보니까, use를 안 쓰고 경로를 직접 붙이는 코드보다
어떤 경로를 쓸지 앞에서 use로 미리 말해 놓은 코드 쪽이
길이가 훨씬 줄어드는 게 보인다.
근데 namespace를 바꿀 때마다 이렇게 새로 불러야 할까?
경로 이름이 길어지거나 계층이 세 단계, 네 단계, 깊어지면?
namespace를 지정하는 일이 아주 번거로운 일이 된다.
그래서 더 간단하게 부르는 방법도 있다.
그냥 별칭을 붙여 버리는 방법이다.
alias 를 붙이면 다른 이름처럼 부를 수 있다.
별칭 붙이는 방법은 아래와 같다.
use 경로 as 별칭
use greeting\en\Hello as HelloEn;
use greeting\ko\Hello as HelloKo;
$obj1 = new HelloEn();
$obj2 = new HelloKo();
참고 자료 : https://www.youtube.com/watch?v=OPH_3gmv5ro&list=PLuHgQVnccGMDzq8zAwEY5lvwDWXWTZjB6&index=21
'PHP' 카테고리의 다른 글
[php] 자주 쓰는 함수 정리 (시간, 파일, 문자열, 숫자) (0) | 2022.03.18 |
---|---|
php 에 존재하는 scope 는 두 종류다. (글로벌 변수, 함수 변수) (0) | 2022.03.17 |
[php] usort 사용법과 예시 (ft. 클로저 함수) (0) | 2022.03.17 |
[php] require / include 차이와 사용법 예시 / _once 붙이면? (0) | 2022.03.17 |
php 에서 spl_autoload_register 의미 (0) | 2022.03.17 |