php

클래스 및 객체(8)

말랑Cow 2021. 8. 20. 00:00
반응형

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의 경로를 다 입력하지 않고 사용이 가능합니다.

반응형