네임 스페이스 란 무엇입니까?
PHP 네임 스페이스 란 무엇입니까?
네임 스페이스 란 무엇입니까?
예를 들어 Layman의 대답은 훌륭 할 것입니다.
네임 스페이스는 함수 및 클래스에 대해 범위가 변수에 대해 수행하는 기능을 수행합니다. 이름 충돌없이 동일한 프로그램의 다른 부분에서 동일한 함수 또는 클래스 이름을 사용할 수 있습니다.
간단히 말해서, 네임 스페이스를 개인의 성으로 생각하십시오 . "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();
네임 스페이스가 없습니까?
네임 스페이스가 없다면 라이브러리를 추가 할 때마다 많은 코드를 (잠재적으로) 변경하거나 함수 이름을 고유하게하기 위해 지루한 접두사를 사용해야합니다. 네임 스페이스를 사용하면 타사 코드를 자체 프로젝트와 혼합 할 때 이름 충돌로 인한 두통을 피할 수 있습니다.
네임 스페이스를 사용하면 이름 아래에 많은 코드를 배치 할 수 있으며 클래스, 함수 및 상수와 이름이 충돌하지 않습니다.
그것은 당신의 코드를 할 수 있습니다 살고 해당 네임 스페이스에.
PHP는 다소 논란의 여지가있는 문자 \
를 사용하여 네임 스페이스 수준을 보여줍니다. 사람들은 이스케이프 캐릭터로도 사용되기 때문에 무기를 들었습니다.
PHP에서 네임 스페이스를 사용하려면 파일 맨 위에 이와 같은 것을 사용하십시오.
namespace my\namespace;
네임 스페이스 에 대한 공식 PHP 문서 에서 더 많은 정보를 찾을 수 있습니다 .
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를 가져와 파일 이름 앞에 디렉토리 이름을 추가해야합니다. 이 같은 원리는 프로그래밍 세계의 네임 스페이스에도 적용됩니다.
“네임 스페이스”를 알고 키워드“사용”에 대해 배우는 것이 더 쉬우므로, 기본 라 라벨 프로젝트를 살펴보고 네임 스페이스를 먼저 설명하겠습니다.
이름이 Controller.php 인 컨트롤러 클래스가 있습니다. 프로젝트 루트 디렉토리의 app / Http / Controllers 경로에 있습니다. Controller.php 라는 다른 컨트롤러 클래스도 있지만이 경로는 vendor /입니다. 프로젝트의 루트 디렉토리에서 laravel / framework / src / Illuminate / Routing
PHP를 처음 접한다면 소스 코드를 볼 필요가 없습니다. 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.php 가 Illuminate \ Routing \ Controller.php 를 BaseController 로 확장 할 수 있습니다 . 줄 :“ class Controller extends BaseController
”.
네임 스페이스를 사용하면 코드를 컨테이너에 넣을 수 있습니다. 이렇게하면 동일한 이름을 공유하는 두 개의 함수 (클래스 및 변수)와 관련된 문제를 방지 할 수 있습니다.
이는 큰 이름의 응용 프로그램이 동일한 이름을 공유하는 코드 조각 관련 문제를 방지하기 위해 작업 할 때 유용합니다.
예를 들어 "TheMessage"라는 두 함수를 원한다고 가정 해 봅시다. 둘 다 서로 다른 메시지를 인쇄 (에코)합니다. 일반적으로 동일한 이름을 공유하는 두 개의 함수를 가질 수 없으므로 구문 오류가 발생합니다.
이 문제를 해결하기 위해 이러한 함수를 별도의 네임 스페이스에 넣을 수 있습니다. 이를 통해 오류없이 두 기능을 모두 사용할 수 있습니다.
디렉토리 및 파일 과 마찬가지로 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
이 원칙은 프로그래밍 단어에서 네임 스페이스로 확장됩니다.
네임 스페이스는 디렉토리처럼 작동합니다. 부모 (또는 다른) 디렉토리의 파일과 동일한 이름의 디렉토리에 파일을 넣는 방법을 알고 있습니까? 네임 스페이스를 사용하면 변수, 함수 및 클래스에 대한 응용 프로그램 내에서이를 수행 할 수 있습니다.
얼마 전 PHP에서 정적 함수의 거대한 클래스에 대한 약간의 경향이있었습니다. 이러한 함수를 호출하는 유일한 방법은 클래스 이름으로 호출을 접두어로 사용하는 것입니다. 이것은 네임 스페이스에 대한 기본적인 시도 였지만 그다지 큰 이점이 없었습니다.
네임 스페이스는 많은 것을 단일 팩에 패키징하는 것과 같습니다. 네임 스페이스를 연필, 통치자, 종이 등 모든 종류의 물건을 넣을 수있는 서랍이라고 상상해보십시오. 서로의 항목을 사용하지 않으려면 서랍에 레이블을 지정하여 누가 누구에게 속하는지 명확하게 결정하십시오.
네임 스페이스는 코드 그룹을 묶는 데 사용되므로 이름 충돌없이 다른 장소에서 사용할 수 있습니다. 이것을 jQuery no conflict 방법으로 생각하면 더 잘 이해할 것입니다.
네임 스페이스는 프로그램에서 이름을 제어하는 간단한 시스템입니다.
이름이 고유하고 충돌을 일으키지 않도록합니다.
참고 URL : https://stackoverflow.com/questions/3384204/what-are-namespaces
'IT story' 카테고리의 다른 글
팬더에서 열 집합 선택 / 제외 (0) | 2020.04.16 |
---|---|
Python 응용 프로그램에서 전송 한 전체 HTTP 요청을 어떻게 볼 수 있습니까? (0) | 2020.04.16 |
WiX 설치 프로그램 업그레이드를 구현하는 방법은 무엇입니까? (0) | 2020.04.16 |
대문자로 "정적 최종 로거"를 선언해야합니까? (0) | 2020.04.16 |
JavaScript를 사용하여 URL에 매개 변수 추가 (0) | 2020.04.16 |