namespace와 use에 대해 정리해보겠습니다.
namespace란 ?
클래스, 함수, 상수의 모음입니다.
클래스가 프로퍼티와 메소드의 집합인 것과 비슷합니다.
사용하는 가장 큰 이유는 전역공간의 문제를 해결할 수 있기 때문입니다.
5.3버전 이전엔 외부 라이브러리를 사용하려면 기존 클래스와 이름이 달라야 했습니다.
동일한 이름의 다른 함수, 프로퍼티(변수)가 존재할 수 없듯이 동일한 이름의 다른 클래스가 같은 전역공간에 존재할 수가 없기 때문입니다.
이 땐 한쪽 클래스의 이름을 변경하고 그 클래스를 확장하거나 참조된 모든 것을 수정해야하기에 외부라이브러리 자체를 사용 못하는 경우도 있었습니다.
namespace가 도입된 이후 같은 이름의 클래스, 함수, 변수라도 namespace를 다르게 사용하면 충돌의 문제가 발생하지 않아 쉽게 외부라이브러리 사용 및 클래스의 작성, 구분이 용이해졌습니다.
namespace는 폴더처럼 동작을 합니다.
같은 폴더에는 같은 이름의 파일이 있을 수 없지만 다른 폴더에는 같은 이름의 파일이 있을 수 있습니다.
폴더 안에 폴더가 있을 수 있듯, namespace도 자신이 원하는 만큼 추가시킬 수 있습니다.
코드로 확인해보겠습니다.
<?php
namespace so\sotest1;
class So{
private $a;
public function __construct($name){
$this->a = $name;
}
public function name(){
return $this->a;
}
}
namespace so\sotest2;
class So{
private $a;
public function __construct($name){
$this->a = $name;
}
public function name(){
return $this->a;
}
}
namespace so\sotest3;
class So{
private $a;
public function __construct($name){
$this->a = $name;
}
public function name(){
return $this->a;
}
}
$so1 = new \so\sotest1\So('sjh1');
echo $so1->name()."<br/>";
$so2 = new \so\sotest2\So('sjh2');
echo $so2->name()."<br/>";
$so3 = new \so\sotest3\So('sjh3');
echo $so3->name()."<br/>";
?>
namespace를 so\sotest1,2,3 으로 지정하여 작성했습니다.
여기서는 so가 최상위 namespace가 됩니다.
처음 so\sotest1 이라는 namespace가 설정된 이후부터 다른 namespace가 설정 될 때까지 코드는 해당 namespace에 속하게 됩니다. 즉, so\sotest2 라는 코드가 나오기 전까지는 so\sotest1 이라는 namespace에 있다고 보면 되겠습니다.
use란 ?
이름이 긴 namespace를 갖고 있는 라이브러리를 사용하려고 하면 클래스, 함수, 변수를 사용할 때 마다 긴 이름의 namespace를 입력해야 하니 불편함을 겪습니다.
이 때 use를 사용하면 namespace를 포함한 class의 전체 명칭 대신에 별명을 통해 사용이 가능합니다.
use sports\soccer\messi as Messi;
use sports\basketball\lebron as Lebron;
위처럼 긴 namespace를 간단하게 바꾸어 사용이 가능합니다.
인스턴스 생성시에도 new Messi, new Lebron 으로 namespace의 경로를 다 입력하지 않고 사용이 가능합니다.
'php' 카테고리의 다른 글
[php 내장함수] 문자 관련 함수 (0) | 2021.08.22 |
---|---|
[php 내장함수] 숫자 관련 함수 (0) | 2021.08.21 |
클래스 및 객체(7) (0) | 2021.08.19 |
클래스 및 객체(6) (0) | 2021.08.18 |
클래스 및 객체(5) (0) | 2021.08.17 |