PHP 네 임 스페이스(Namespace)사용 설명
네 임 스페이스 의 가장 명확 한 목적 은 이름 바 꾸 기 문 제 를 해결 하 는 것 입 니 다.PHP 에 서 는 두 함수 나 클래스 가 같은 이름 을 가 질 수 없습니다.그렇지 않 으 면 치 명 적 인 오류 가 발생 할 수 있 습 니 다.이 경우 이름 이 중복 되 는 것 을 피하 면 해결 할 수 있 으 며,가장 흔히 볼 수 있 는 방법 은 접 두 사 를 약속 하 는 것 이다.
예:항목 에는 두 개의 모듈 이 있 습 니 다.article 과 message board 는 각각 사용자 의 메 시 지 를 처리 하 는 클래스 Comment 이 있 습 니 다.그 후에 저 는 모든 사용자 의 댓 글 에 대한 정보 통계 기능 을 추가 하고 싶 을 것 입 니 다.예 를 들 어 저 는 모든 댓 글 의 수량 을 얻 고 싶 습 니 다.이때 이들 의 Comment 를 호출 하 는 방법 은 좋 은 방법 이지 만 각자 의 Comment 류 를 동시에 도입 하 는 것 은 분명 안 됩 니 다.코드 가 잘못 되 고 다른 곳 에서 어떤 Comment 를 다시 쓰 는 것 도 유지 성 을 떨 어 뜨 릴 수 있 습 니 다.그러면 이 때 는 클래스 이름 만 재 구성 할 수 있 습 니 다.저 는 이름 규칙 을 약 속 했 습 니 다.클래스 이름 앞 에 모듈 이름 을 추가 하 겠 습 니 다.이렇게:ArticleComment、MessageBoard_Comment
이름 이 길 어 지 는 것 을 볼 수 있 습 니 다.그것 은 나중에 Comment 를 사용 할 때 더 많은 코드 를 쓰 는 것 을 의미 합 니 다(적어도 문자 가 많 습 니 다).또한 앞으로 각 모듈 에 더 많은 통합 기능 을 추가 하거나 서로 호출 하려 면 이름 이 바 뀔 때 이름 을 재 구성 해 야 한다.물론 프로젝트 를 시작 할 때 이 문 제 를 주의 하고 명명 규칙 을 규정 하면 이 문 제 를 잘 피 할 수 있다.또 다른 해결 방법 은 네 임 스페이스 를 사용 하 는 것 을 고려 할 수 있다.
설명:
본 고 에서 언급 한 상수:PHP 5.3 시작 const 키 워드 는 클래스 의 외부 에 사용 할 수 있 습 니 다.const 와 define 은 상수(그들의 차 이 는 자세히 설명 하지 않 음)를 설명 하 는 데 사용 되 지만 네 임 스페이스 에서 define 의 역할 은 전체 적 이 고 const 는 현재 공간 에 작용 합 니 다.내 가 글 에서 언급 한 상수 란 const 성명 을 사용 하 는 상수 이다.
기본 네 임 스페이스 는 코드 를 서로 다른 공간(구역)으로 나 누 었 다.모든 공간의 상수,함수,클래스(게 으 름 을 피 우기 위해 나 는 아래 에서 그것들 을 요소 라 고 부른다)의 이름 은 서로 영향 을 주지 않 는 다.이것 은 우리 가 흔히 언급 하 는'패키지'와 비슷 한 개념 이다.
네 임 스페이스 를 만 들 려 면 namespace 키 워드 를 사용 해 야 합 니 다.
<?php
// 'Article'
namespace Article;
?>
주의해 야 할 것 은 현재 스 크 립 트 파일 의 첫 번 째 네 임 스페이스 앞 에 코드 가 있 으 면 안 됩 니 다.아래 의 작성 방법 은 모두 잘못 되 었 습 니 다.
//
//
<?php
$path = "/";
class Comment { }
namespace Article;
?>
//
//
<html></html>
<?php
namespace Article;
?>
왜 첫 번 째 네 임 스페이스 를 말 합 니까?같은 스 크 립 트 파일 에 여러 개의 네 임 스페이스 를 만 들 수 있 기 때 문 입 니 다.다음 에 저 는 두 개의 네 임 스페이스 를 만 들 었 습 니 다.그리고 이 두 공간 에 각각 Comment 류 요 소 를 추 가 했 습 니 다.
<?php
// 'Article'
namespace Article;
// Comment Article
class Comment { }
// 'MessageBoard'
namespace MessageBoard;
// Comment MessageBoard
class Comment { }
?>
서로 다른 공간 에서 다른 요 소 를 직접 호출 할 수 없고 네 임 스페이스 의 문법 을 사용 해 야 합 니 다.
<?php
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
// (MessageBoard) Comment
$comment = new Comment();
// Article Comment
$article_comment = new \Article\Comment();
?>
Message Board 빈 공간 에서 article 공간의 Comment 류 를 호출 할 때파일 경로 와 같은 문법 을 사 용 했 습 니 다:\공간 명\요소 명클래스 를 제외 하고 함수 와 상수 에 대한 용법 은 같 습 니 다.다음은 두 공간 에 새로운 요 소 를 만 들 고 Message Board 공간 에서 값 을 출력 하 였 습 니 다.
<?php
namespace Article;
const PATH = '/article';
function getCommentTotal() {
return 100;
}
class Comment { }
namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
return 300;
}
class Comment { }
// 、
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();
// Article 、
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();
?>
그리고 나 서 나 는 Article 공간의 요소 데 이 터 를 얻 었 다.하위 공간 네 임 스페이스 의 호출 문법 은 파일 경로 처럼 일리 가 있 습 니 다.이 는 우리 가 각 공간 간 의 관 계 를 설명 할 수 있 도록 합 니 다.
죄송합니다.아 티 스 트 와 message board 라 는 두 모듈 은 모두 같은 블 로그 프로젝트 에 있 습 니 다.만약 에 네 임 스페이스 로 그들의 관 계 를 표현 하면 다음 과 같다.
<?php
// blog article
namespace Blog\Article;
class Comment { }
// blog message board
namespace Blog\MessageBoard;
class Comment { }
//
$comment = new Comment();
// Blog\Article
$article_comment = new \Blog\Article\Comment();
?>
그리고 서브 공간 은 여러 가지 차원 을 정의 할 수 있다.예 를 들 어 블 로그\Article\Archives\\Date 등 이다.공공 공간 에 나 는 commoninc.php 스 크 립 트 파일 에는 좋 은 함수 와 클래스 가 있 습 니 다.
<?php
function getIP() { }
class FilterXSS { }
?>
네 임 스페이스 에 이 스 크 립 트 를 도입 하면 스 크 립 트 의 요 소 는 이 네 임 스페이스 에 귀속 되 지 않 습 니 다.이 스 크 립 트 에 다른 네 임 스페이스 가 정의 되 지 않 으 면 그 요 소 는 항상 공공 공간 에 있 습 니 다.
<?php
namespace Blog\Article;
//
include './common_inc.php';
$filter_XSS = new FilterXSS(); // : Blog\Article\FilterXSS
$filter_XSS = new \FilterXSS(); //
?>
공공 공간 을 호출 하 는 방식 은 요소 이름 앞 에\를 추가 하면 됩 니 다.그렇지 않 으 면 PHP 해상도 기 는 현재 공간 에 있 는 요 소 를 호출 하고 싶다 고 생각 할 것 입 니 다.사용자 정의 요 소 를 제외 하고 PHP 자체 요 소 를 포함 하여 모두 공공 공간 에 속 합 니 다.사실 공공 공간의 함수 와 상수 가 추가 되 지 않 아 도\\정상적으로 호출 될 수 있 습 니 다(PHP 가 왜 이러 는 지 모 르 겠 습 니 다).하지만 요 소 를 정확하게 구분 하기 위해 서 는 함 수 를 호출 할 때 추가 하 는 것 을 권장 합 니 다\
명칭 용 어 는 별명 과 가 져 오기 전에 공간 세 가지 명칭 에 대한 용어 와 PHP 가 그것들 을 어떻게 해석 하 는 지 알 아야 한다.공식 문 서 를 아주 잘 말 해서 나 는 직접 가 져 왔 다.
1.이름 을 제한 하지 않 거나 접두사 가 포함 되 지 않 은 클래스 이름,예 를 들 어$comment=new Comment();현재 네 임 스페이스 가 Blog\Article 이면 Comment 는 Blog\\Article\\Comment 로 해 석 됩 니 다.Comment 를 사용 하 는 코드 가 네 임 스페이스 에 포함 되 지 않 는 코드(전역 공간)를 사용 하면 Comment 는 Comment 로 해 석 됩 니 다.2.이름 을 제한 하거나 접두사 이름 을 포함 합 니 다.예 를 들 어$comment=new Article\\Comment();.현재 네 임 스페이스 가 Blog 라면 Comment 는 Blog\Article\\Comment 로 해 석 됩 니 다.Comment 를 사용 하 는 코드 가 네 임 스페이스 에 포함 되 지 않 는 코드(전역 공간)를 사용 하면 Comment 는 Comment 로 해 석 됩 니 다.3.이름 을 완전히 제한 하거나 전체 접두사 연산 자의 이름 을 포함 합 니 다.예 를 들 어$comment=new\Article\Comment();이러한 상황 에서 Comment 는 항상 코드 의 문자 이름(literal name)Article\\Comment 으로 해 석 됩 니 다.
사실 이 세 가지 이름 을 파일 이름(예 를 들 어 comment.php),상대 경로 이름(예 를 들 어./article/comment.php),절대 경로 이름(예 를 들 어/blog/article/comment.php)과 비교 하면 더욱 쉽게 이해 할 수 있 습 니 다.
나 는 몇 가지 예 를 들 어 그들 을 표시 했다.
<?php
// Blog
namespace Blog;
class Comment { }
// , Blog
// Blog\Comment();
$blog_comment = new Comment();
// , Blog
// Blog\Article\Comment();
$article_comment = new Article\Comment(); // \
// , Blog
// Blog\Comment();
$article_comment = new \Blog\Comment(); // \
// , Blog
// Blog\Article\Comment();
$article_comment = new \Blog\Article\Comment(); // \
// Blog Article
namespace Blog\Article;
class Comment { }
?>
사실은 이전에 나 는 비 한정 명칭 과 완전 한정 명칭 을 사용 해 왔 는데,지금 은 그들 이 마침내 그들의 이름 을 불 러 낼 수 있 게 되 었 다.별명 과 가 져 오기 별명 과 가 져 오기 이름 공간 요 소 를 호출 하 는 단축 키 로 볼 수 있 습 니 다.PHP 는 가 져 오기 함수 나 상수 가 지원 되 지 않 습 니 다.
그것들 은 모두 use 연산 자 를 사용 하여 이 루어 집 니 다.
<?php
namespace Blog\Article;
class Comment { }
// BBS ( )
namespace BBS;
//
use Blog\Article;
//
$article_comment = new Article\Comment();
//
use Blog\Article as Arte;
//
$article_comment = new Arte\Comment();
//
use Blog\Article\Comment;
//
$article_comment = new Comment();
//
use Blog\Article\Comment as Comt;
//
$article_comment = new Comt();
?>
요 소 를 가 져 올 때 현재 공간 에 같은 이름 의 요소 가 있 으 면 어떻게 되 는 지 알 게 되 었 습 니 다.분명히 결 과 는 치 명 적 인 오류 가 발생 할 것 이다.예:
<?php
namespace Blog\Article;
class Comment { }
namespace BBS;
class Comment { }
Class Comt { }
//
use Blog\Article\Comment;
$article_comment = new Comment(); // Comment ,
//
use Blog\Article\Comment as Comt;
$article_comment = new Comt(); // Comt ,
?>
동적 호출 PHP 는 namespace 키워드 와 를 제공 합 니 다.NAMESPACE__마법 상수 동적 접근 요소,NAMESPACE__조합 문자열 의 형식 을 통 해 동적 으로 접근 할 수 있 습 니 다.
<?php
namespace Blog\Article;
const PATH = '/Blog/article';
class Comment { }
//namespace
echo namespace\PATH; ///Blog/article
$comment = new namespace\Comment();
// __NAMESPACE__
echo __NAMESPACE__; //Blog\Article
//
$comment_class_name = __NAMESPACE__ . '\Comment';
$comment = new $comment_class_name();
?>
문자열 형식 호출 문제 위의 동적 호출 예 에서 우 리 는 문자열 형식의 동적 호출 방식 을 보 았 습 니 다.이런 방식 을 사용 하려 면 두 가지 문 제 를 주의해 야 합 니 다.1.따옴표 를 사용 할 때 특수 문 자 는 전의
<?php
namespace Blog\Article;
class name { }
// Blog\Article
ame
$class_name = __NAMESPACE__ . "
ame"; //
$name = new $class_name(); //
?>
될 수 있 습 니 다.2.한 정 된 이름 이 라 고 생각 하지 않 습 니 다.PHP 는 스 크 립 트 를 컴 파일 할 때 요소 가 있 는 공간 과 가 져 온 상황 을 확인 합 니 다.스 크 립 트 를 분석 할 때 문자열 형식 호출 은 이름 을 제한 하지 않 고 이름 을 완전히 제한 하 는 것 으로 만 볼 수 있 으 며 이름 을 제한 할 수 없습니다.
<?php
namespace Blog;
// Common
use Blog\Article\Common;
// Blog\Article\Common
$common_class_name = 'Common';
// , Common , Common
$common = new $common_class_name(); // :Common
// Blog\Article\Common
$common_class_name = 'Article\Common';
// , Article Common , Blog\Article Article
$common = new $common_class_name(); // :Article\Common
namespace Blog\Article;
class Common { }
?>
제 가 PHP 의 네 임 스페이스 에 대해 방금 접 했 기 때문에 실천 하지 않 은 건 의 를 함부로 해 서 는 안 됩 니 다.저 는 개인 적 으로 네 임 스페이스 의 역할 과 기능 이 매우 강하 다 고 생각 합 니 다.플러그 인 이나 유 니 버 설 라 이브 러 리 를 쓰 려 면 더 이상 이름 을 바 꾸 는 문 제 를 걱정 하지 않 아 도 됩 니 다.그러나 프로젝트 가 어느 정도 진행 되면 네 임 스페이스 를 늘 려 이름 을 바 꾸 는 문 제 를 해결 해 야 한다.재 구성 보다 작업량 이 적 지 않 을 것 이 라 고 생각한다.또한 문법 이 프로젝트 에 어느 정도 복잡 도 를 증가 시 킬 수 있다 는 것 을 인정 할 수 밖 에 없 기 때문에 프로젝트 를 시작 할 때 이 를 잘 계획 하고 명명 규범 을 제정 해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker 구현 확인 - cgroups 편 -Docker는 커널 기능의 조합으로 구현됩니다. 그 중에서도 주요한 것이 "cgroups"와 "namespace"이다. 이번에는 cgroups에 대해 조사해 보았습니다. 그 그룹내의 태스크에 대해서 다양한 자원 제어...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.