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 의 네 임 스페이스 에 대해 방금 접 했 기 때문에 실천 하지 않 은 건 의 를 함부로 해 서 는 안 됩 니 다.저 는 개인 적 으로 네 임 스페이스 의 역할 과 기능 이 매우 강하 다 고 생각 합 니 다.플러그 인 이나 유 니 버 설 라 이브 러 리 를 쓰 려 면 더 이상 이름 을 바 꾸 는 문 제 를 걱정 하지 않 아 도 됩 니 다.그러나 프로젝트 가 어느 정도 진행 되면 네 임 스페이스 를 늘 려 이름 을 바 꾸 는 문 제 를 해결 해 야 한다.재 구성 보다 작업량 이 적 지 않 을 것 이 라 고 생각한다.또한 문법 이 프로젝트 에 어느 정도 복잡 도 를 증가 시 킬 수 있다 는 것 을 인정 할 수 밖 에 없 기 때문에 프로젝트 를 시작 할 때 이 를 잘 계획 하고 명명 규범 을 제정 해 야 한다.

좋은 웹페이지 즐겨찾기