2015-08-20
//------ 재작성 2019.02.10

php 5.3부터 네임스페이스가 추가 되었다.
해당 기능은 같은 이름의 class나 function을 구별해서 사용 할 수 있도록 고안된 방법이다.

우선 아래와 같은 상황을 생각해 보자

php의 autoload기능 때문에 test1.php이라는 파일에 test1이라는 이름의 class를 생성해 놓았다.
그런데 해당 파일과 동일한 이름의 파일이 다른 위치에 또 존재한다고 생각해보자.
이럴때 두파일을 동시에 불러와서 두 class를 동시에 사용하기 위해서는 namespace기능이 필요하다.

우선 namespace를 사용할때는 2가지 규칙을 알아둬야 한다.
1. 해당 문서의 최상단에 위치 해야 한다.
2. 경로구분은 역슬레쉬(\)를 사용 한다.

아래 예를 보자.

test_class1\test1.php 파일
<?php
namespace test_class1;

class test1{
	function hello(){
		echo "test_class1 just echo!<br>";
	}
}
test_class2\test1.php 파일
<?php
namespace test_class2;

class test1{
	function hello(){
		echo "test_class2 just echo!<br>";
	}
}
자 그러면, 아래예처럼, index.php파일에서 위 두 파일을 불러서 사용해보자.
<?php
spl_autoload_register(function ($class) {
	echo "class autoload: ".$class."<br>";
    include $class . '.php';
});

$test1 = new test_class1\test1();
$test2 = new test_class2\test1();

echo "<br>";
$test1->hello();
$test2->hello();

echo "<br>";
use test_class2\test1;

$test3 = new test1();
$test3->hello();
class autoload: test_class1\test1 class autoload: test_class2\test1 test_class1 just echo! test_class2 just echo! test_class2 just echo!
그런데 여기서 언급하지 않은 use라는 키워드가 사용된 것을 확인 할 수 있을 것이다. 우선 use는 위에서 보는거처럼 매번, 모든 namespace를 입력하기 번거로울 경우, 사용하면 편하다 use지시어가 사용된 이후에는 해당 class의 이름만 사용해도 use에서 명시된 namespace의 class로 인식되어 사용되는 것이다. 그리고 아래와 같이 중복된 class 이름이 있을때, as로 별칭을 줄 수도 있고, 여러개의 use를 사용하는 것도 가능하다 test_class1\test2.php 파일
<?php
namespace test_class1;

class test2{
	function hello(){
		echo "test_class1 test2 just echo!<br>";
	}
}
index.php 파일
<?php
spl_autoload_register(function ($class) {
	echo "class autoload: ".$class."<br>";
    include $class . '.php';
});

use test_class1\test1;
// use test_class2\test1; 에러뜸
use test_class2\test1 as test_class2_test1;
use test_class1\test2;


$test1 = new test1();
$test2 = new test_class2_test1();
$test3 = new test2();

echo "<br>";
$test1->hello();
$test2->hello();
$test3->hello();
class autoload: test_class1\test1 class autoload: test_class2\test1 class autoload: test_class1\test2 test_class1 just echo! test_class2 just echo! test_class1 test2 just echo!