namespace
입니다.inlcude
하는데 만약 같은 클래스, 함수 혹은 변수 이름을 사용하고 있다면
충돌이 나기 때문에 그런 문제를 해결하기 위해 사용됩니다.greeting_en.php
<?php
function welcome() {
return 'Hello world';
}
greeting_ko.php
<?php
function welcome() {
return '안녕 세상아';
}
main.php
require_once 'greeting_ko.php';
require_once 'greeting_en.php';
echo welcome();
echo welcome();
welcome
라는 함수를
선언했기 때문입니다.welcome
을 실행하고 싶지만 이름이 같기 때문에 방법이 없습니다.
이런 경우 다음과 같이 namespace
를 사용하여 해결할 수 있습니다.greeting_en_ns.php
<?php
namespace language\en;
function welcome() {
return 'Hello world';
}
greeting_ko_ns.php
<?php
namespace language\ko;
function welcome() {
return '안녕 세상아';
}
main.php
require_once 'greeting_ko.php';
require_once 'greeting_en.php';
echo language\ko\welcome();
echo language\en\welcome();
namespace
키워드로 선언할 수 있고 declare
를 제외하고 반드시 코드보다 먼저
작성되어야 합니다.<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script
<?php
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
greeting_langs.php
<?php
namespace language\en;
function welcome() {
return 'Hello world';
}
namespace language\ko;
function welcome() {
return '안녕 세상아';
}
<?php
namespace language\en {
function welcome() {
return 'Hello world';
}
}
namespace language\ko {
function welcome() {
return '안녕 세상아';
}
}
namespace language\en { function welcome() { return ‘Hello world’; } }
namespace { function welcome() { return ‘안녕 세상아’; } }
## Using namespaces: Basics
* PHP가 네임 스페이스로 구분 된 요소를 어떻게 요구 하는지를 이해하는 것이
중요합니다.
* namespace와 파일시스템을 비교하여 생각해봅시다.
1. `file.txt`같은 상대경로 파일이름의 경우 `currentdirectory/foo.txt`로
해석됩니다. 만약 현재 위치가 `/home/foo`일 경우 `/home/foo/foo.txt`로
해석됩니다.
2. `subdirectory/foo.txt`의 경우 `currentdirectory/subdirectory/foo.txt`로
해석됩니다.
3. 절대경로인 `/main/foo.txt`는 `/main/foo.txt`로 해석됩니다.
* 같은 원리로 PHP namespace에도 적용이 될 수 있습니다.
1. `prefix`없이 사용될 때, 예를 들면 `$a = new foo()` 혹은
`foo::staticmethod()`
* 만약 현재 namespace를 `currentnamespace`라고 한다면
`currentanmespace\foo`로 해석합니다.
* 만약 현재 namespace에서 정의되어있지 않은 경우 global변수로 해석합니다.
2. `$a = new subnamespace\foo()` 혹은 `subnamespace\foo::staticmethod()` 일
경우
* 현재 namespace가 `currentnamespace`일 때
`currentnamespace\subnamespace\foo` 로 해석합니다.
* 만약 namespace가 정의되어있지 않은 경우에는 `subnamespace\foo`로
해석합니다.
3. `$a = new \currentnamespace\foo()` 혹은
`\currentnamespace\foo::staticmethod();`일 경우에는
* 이것은 항상 `currentnamespace\foo`로 해석됩니다.
### Example #1
file1.php
```php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>
example1.php
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
*
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>
PHP는 세가지의 aliasing혹은 importing을 지원합니다.
PHP5.6+에서는 함수와 상수이름도 가능합니다.
use
오퍼레이터를 이용해서 aliasing을 할 수 있습니다.
자바스크립트로 직접 만들면서 배우는 - 자료구조와 알고리즘 강의 바로 가기
실습으로 마스터하는 OAuth 2.0: 기본부터 보안 위험까지 - OAuth 2.0 강의 바로 가기
기계인간 이종립, 소프트웨어 개발의 지혜 - Git 강의 바로 가기
코드숨에서 매주 스터디를 진행하고 있습니다. 메일을 등록하시면 새로운 스터디가 시작될 때 알려드릴게요!