네임 스페이스 란 무엇입니까?


241

PHP 네임 스페이스 란 무엇입니까?

네임 스페이스 란 무엇입니까?

예를 들어 Layman의 대답은 훌륭 할 것입니다.

답변:


573

네임 스페이스는 함수 및 클래스에 대해 범위가 변수에 대해 수행하는 기능을 수행합니다. 이름 충돌없이 동일한 프로그램의 다른 부분에서 동일한 함수 또는 클래스 이름을 사용할 수 있습니다.

간단히 말해서, 네임 스페이스를 개인의 성으로 생각하십시오 . "John"이라는 두 사람이 있다면 성을 사용하여 구별 할 수 있습니다.

시나리오

라는 함수를 사용하는 애플리케이션을 작성한다고 가정하십시오 output(). 귀하의 output()기능은 귀하의 페이지에 HTML 코드를 모두 가져와 사용자에게 전송한다.

나중에 응용 프로그램이 커지고 새로운 기능을 추가하려고합니다. RSS 피드를 생성 할 수있는 라이브러리를 추가합니다. 이 라이브러리는 또한 output()최종 피드를 출력하기 위해 명명 된 함수를 사용합니다 .

를 호출하면 output()PHP는 output()함수 를 사용할지 RSS 라이브러리 함수 를 사용할지 어떻게 알 수 output()있습니까? 그렇지 않습니다. 네임 스페이스를 사용 하지 않는 한

우리는 두 가지 output()기능을 가지고 어떻게 해결 합니까? 단순한. 우리는 각 output()함수를 고유 한 네임 스페이스에 붙여 넣습니다 .

다음과 같이 보일 것입니다.

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

나중에 다른 기능을 사용하려면 다음을 사용하십시오.

\MyProject\output();
\RSSLibrary\output();

또는 네임 스페이스 중 하나에 있다고 선언 한 다음 해당 네임 스페이스를 호출 할 수 있습니다 output().

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

네임 스페이스가 없습니까?

네임 스페이스가 없다면 라이브러리를 추가 할 때마다 많은 코드를 (잠재적으로) 변경하거나 함수 이름을 고유하게 만들기 위해 지루한 접두사를 만들어야합니다. 네임 스페이스를 사용하면 타사 코드를 자체 프로젝트와 혼합 할 때 이름 충돌로 인한 두통을 피할 수 있습니다.


어떤 이유로 file1에서 네임 스페이스를 사용하면 file2에 파일을 요구하거나 포함 할 필요가 없다고 생각했습니다. 단위 테스트 결과는 그렇지 않습니다.
Aaron Bell

1
@AaronBell 자동로드 를 확인하고 싶을 수도 있습니다 .
cbednarski

21

네임 스페이스를 사용하면 이름 아래에 많은 코드를 배치 할 수 있으며 클래스, 함수 및 상수와 이름이 충돌하지 않습니다.

그것은 당신의 코드를 할 수 있습니다 살고 해당 네임 스페이스에.

PHP는 다소 논란의 여지가있는 문자 \ 를 사용하여 네임 스페이스 수준을 보여줍니다. 사람들은 이스케이프 캐릭터로도 사용되기 때문에 무기를 들었습니다.

PHP에서 네임 스페이스를 사용하려면 파일 맨 위에 이와 같은 것을 사용하십시오.

namespace my\namespace;

네임 스페이스 에 대한 공식 PHP 문서 에서 더 많은 정보를 찾을 수 있습니다 .


11

“네임 스페이스”를 알고 키워드“사용”에 대해 배우는 것이 더 쉬우므로, 기본 라 라벨 프로젝트를 살펴보면서 네임 스페이스를 먼저 설명하겠습니다.

이름이 Controller.php 인 컨트롤러 클래스가 있습니다. 프로젝트 루트 디렉토리의 app / Http / Controllers 경로에 있습니다. Controller.php 라는 다른 컨트롤러 클래스도 있지만이 경로는 vendor /입니다. 프로젝트의 루트 디렉토리에서 laravel / framework / src / Illuminate / Routing

PHP를 처음 접하는 사용자라면 혼란 스러울 수 있으므로 아직 소스 코드를 볼 필요는 없습니다. 대신 우리가 관심을 갖고 "네임 스페이스"와 "사용법을 이해하는 데 도움이되는 부분을 설명하겠습니다. ”.

사실 첫 번째 컨트롤러 클래스 인 app / Http / Controllers / Controller.php 는 두 번째 컨트롤러 클래스 vendor / laravel / framework / src / Illuminate / Routing / Controller.php 를 사용해야합니다 . 중요한 라우팅 기능을 처리하기 위해 해당 컨텐츠에 액세스하려면 실제로이 클래스를 확장해야합니다.

그렇다면 클래스는 같은 이름을 가진 다른 클래스를 어떻게 확장 할 수 있습니까? class Controller extends Controller? 두 클래스구별 있는 방법 없고 namespace편리한 위치 에 use키워드가 사용을 허용하는 사명을 완수하는 데 도움 이되지 않는 한 이것은 작동하지 않습니다 . (클래스; 메소드; 인터페이스 및 상수) 동일한 범위에서 동일한 이름으로.

이제 코드에서 어떻게 수행됩니까? 매우 간단합니다! 우리가 보면 응용 프로그램 / HTTP / 컨트롤러 / Controller.php의 : 소스 코드, 우리는 다음과 같이 선언 된 클래스 네임 스페이스의 상단에 볼 수있는namespace App\Http\Controllers이 그것이 지금 다른 클래스에서 참조 할 수 있도록이 클래스를 네임 스페이스를 제공하는 방법입니다 수 있도록, 이것은 프로젝트의 루트 디렉토리 에서이 클래스의 경로와 동일하지만 거의 차이가 없으며\"/" (Windows의 명령 프롬프트와 동일) 대신""의 사용법입니다.또 다른 차이점이 있으며 자본이있는 App입니다. 네임 스페이스의 'A'와 경로의 소문자 'a'가있는 'app' 또한 네임 스페이스는 대소 문자를 구분합니다.

따라서 네임 스페이스는 경로와 별도의 개념이므로 도움이된다면 경로 구조를 따를 수 있지만 클래스, 메소드, 인터페이스 또는 상수에 대한 정확한 경로 일 필요는 없습니다. 예 : vendor / laravel / framework /src/Illuminate/Routing/Controller.php 소스 코드,

클래스의 맨 위에 네임 스페이스가 다음과 같이 선언되어 있습니다. Illuminate\Routing

이제“ use”키워드를 살펴보고,“ ”키워드 use를 사용하여 클래스가 클래스에서 사용하려는 특정 클래스 또는 함수를 클래스에 알리도록합니다.

네임 스페이스로 참조함으로써 특정 클래스 나 메소드를 사용할 것임을 클래스에 알려주 는 것을 가져 오거나 포함하지 않고 app / Http / Controllers / Controller.php 소스 코드를 살펴 보겠습니다. 라인에서 볼 수 있습니다 :“ use Illuminate\Routing\Controller as BaseController”,“ use”키워드 다음에 대상 클래스의 네임 스페이스 가옵니다 (Illuminate \ Routing \ Controller.php와 Illuminate \ Routing \ Controller 'without .php extension'은 상호 교환 가능합니다)

as”키워드와 “ ”키워드를 함께 use사용하여 특정 클래스, 메소드, 인터페이스 또는 상수 에 별명을 지정하면 app / Http / Controllers / Controller.phpIlluminate \ Routing \ Controller.php 를 BaseController 로 확장 할 수 있습니다 . 줄 :“ class Controller extends BaseController”.


9

Java의 패키지와 같은 다른 프로그래밍 언어의 네임 스페이스와 같은 기술이 있습니다. 그것들은 프로젝트와 같은 이름을 가진 다중 클래스를 가질 수 있도록 사용되었습니다.

PHP 문서 ( http://www.php.net/manual/en/language.namespaces.rationale.php )에서 :

네임 스페이스 란 무엇입니까? 가장 넓은 정의에서 네임 스페이스는 항목을 캡슐화하는 방법입니다. 이것은 많은 곳에서 추상적 개념으로 볼 수 있습니다. 예를 들어, 모든 운영 체제 디렉토리에서 관련 파일을 그룹화하고 그 안의 파일에 대한 네임 스페이스 역할을합니다. 구체적인 예로서, foo.txt 파일은 / home / greg 디렉토리와 / home / other 디렉토리에 존재할 수 있지만 foo.txt의 두 사본은 동일한 디렉토리에 공존 할 수 없습니다. 또한 / home / greg 디렉토리 외부의 foo.txt 파일에 액세스하려면 디렉토리 구분 기호를 사용하여 디렉토리 이름을 파일 이름 앞에 추가하여 /home/greg/foo.txt를 가져와야합니다. 이 같은 원리는 프로그래밍 세계의 네임 스페이스에도 적용됩니다.


1
Java와 비교하는 것은 나쁜 생각입니다. Java에는 패키지가 있으며 패키지 가시성 클래스가 있습니다. 액세스하는 패키지에 따라 보호 된 구성원의 가시성
Artefacto

1
그것들은 패키지와 같지 않지만 같은 아이디어를 공유합니다.
2ndkauboy

질문은 일반적으로 어떤 네임 스페이스가 있는지 묻기 때문에 대답이 의미가 있습니다.
kiamlaluno

@kiam 그들은 충돌하지 않는 클래스 이름이라는 하나의 아이디어를 공유합니다. 그들은 가시성의 아이디어를 공유하지 않습니다.
Artefacto

@Artefacto : Kau-Boy는 두 언어의 네임 스페이스가 동일하다고 말하지 않았습니다.
kiamlaluno

4

디렉토리파일 과 마찬가지로 PHP의 네임 스페이스는 클래스 , 함수 , 인터페이스상수 를 그룹화하는 역할을 합니다.

예:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

전역 공간에서 항목을 래핑하는 방법을 제공하며 프로그램에서 이름 충돌을 일으키지 않고 일반 항목 이름을 사용할 수 있습니다. PHP 5.3.0, PHP 7에서 지원됩니다.

그러나 PHP 네임 스페이스와 유닉스 기반 파일 시스템 사이에는 약간의 제한이 있습니다.

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

원칙은 프로그래밍 단어에서 네임 스페이스로 확장됩니다.


3

네임 스페이스는 디렉토리처럼 작동합니다. 부모 (또는 다른) 디렉토리의 파일과 동일한 이름의 디렉토리에 파일을 넣는 방법을 알고 있습니까? 네임 스페이스를 사용하면 변수, 함수 및 클래스에 대한 응용 프로그램 내에서이를 수행 할 수 있습니다.

얼마 전 PHP에서 정적 함수의 거대한 클래스에 대한 약간의 경향이있었습니다. 이러한 함수를 호출하는 유일한 방법은 클래스 이름으로 호출을 접두어로 사용하는 것입니다. 이것은 네임 스페이스에 대한 기본적인 시도 였지만 그다지 큰 이점이 없었습니다.


2

네임 스페이스를 사용하면 코드를 컨테이너에 넣을 수 있습니다. 이렇게하면 동일한 이름을 공유하는 두 개의 함수 (클래스 및 변수)와 관련된 문제를 방지 할 수 있습니다.

이는 큰 이름의 응용 프로그램이 동일한 이름을 공유하는 코드 조각 관련 문제를 방지하기 위해 작업 할 때 유용합니다.

예를 들어 "TheMessage"라는 두 개의 함수를 원한다고 가정 해 봅시다. 둘 다 서로 다른 메시지를 인쇄 (에코)합니다. 일반적으로 동일한 이름을 공유하는 두 개의 함수를 가질 수 없으므로 구문 오류가 발생합니다.

이 문제를 해결하기 위해 이러한 함수를 별도의 네임 스페이스에 넣을 수 있습니다. 이를 통해 오류없이 두 기능을 모두 사용할 수 있습니다.


2

네임 스페이스는 많은 것을 단일 팩으로 패키징하는 것과 같습니다. 네임 스페이스를 서랍, 연필, 자, 종이 등 모든 것을 넣을 수있는 서랍이라고 상상해보십시오. 서로의 항목을 사용하지 않으려면 서랍에 레이블을 지정하여 누가 누구에게 속하는지 명확하게 결정하십시오.


0

네임 스페이스는 코드 그룹을 묶는 데 사용되므로 이름 충돌없이 다른 장소에서 사용할 수 있습니다. 이것을 jQuery no conflict 방법으로 생각하면 더 잘 이해할 것입니다.


"jQuery no conflict method"는 무엇을 의미합니까? PHP와 어떤 관련이 있습니까?
Nico Haase

0

네임 스페이스는 프로그램에서 이름을 제어하는 ​​간단한 시스템입니다.
이름이 고유하고 충돌을 일으키지 않도록합니다.


어떤 종류의 "이름"에 대해 이야기하고 있습니까?
Nico Haase

0

네임 스페이스를 사용하여 생성 한 코드와 내부 PHP 클래스 / 함수 / 상수 또는 타사 클래스 / 함수 / 상수 간의 이름 충돌을 피할 수 있습니다. 네임 스페이스는 또한 첫 번째 문제를 줄이고 소스 코드의 가독성을 향상 시키도록 설계된 Extra_Long_Names의 별칭을 지정하거나 단축 할 수 있습니다.

우리 모두 알다시피, 네임 스페이스와 특성은 PHP에서 새로운 것은 아니지만, 여전히 많은 PHP 개발자들은 복잡성 때문에 이러한 위대한 개념을 사용하지 않습니다. 따라서이 게시물에서. 예를 들어 정리해 보겠습니다. 네임 스페이스와 특성은 무엇입니까?

코드에서 코드를 구현하여 코드를 재사용하고 확장 할 수있는 방법은 무엇입니까?

네임 스페이스의 장점

네임 스페이스를 사용하여 생성 한 코드와 내부 PHP 클래스 / 함수 / 상수 또는 타사 클래스 / 함수 / 상수 간의 이름 충돌을 피할 수 있습니다.

네임 스페이스는 또한 첫 번째 문제를 줄이고 소스 코드의 가독성을 향상 시키도록 설계된 Extra_Long_Names의 별칭을 지정하거나 단축 할 수 있습니다. 예를 들어 네임 스페이스를 이해하자. htdocs (xampp) 또는 www (xwamp)에“php_oops”라는 폴더 이름을 생성하고“namespaces”라는 루트 디렉토리에 새 폴더를 생성 한 다음 namespaces 폴더에 index.php 파일을 생성하십시오.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

참조 -https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
다른 사이트에서 자신의 콘텐츠에 연결하는 데주의하십시오 . 스패머가 되고 싶지 않습니다 . 여기에 대부분의 내용을 포함시켜야하며 링크는 참조 용으로 만 사용하십시오.
Dharman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.