PHP 네 임 스페이스 상세 분석(namespace)
PHP 네 임 스페이스 는 다음 과 같은 두 가지 문 제 를 해결 할 수 있 습 니 다.
기본적으로 모든 상수,클래스,함수 이름 은 전체 공간 에 놓 여 있 으 며,PHP 가 네 임 스페이스 를 지원 하기 전과 같 습 니 다.
네 임 스페이스 는 키워드 namespace 를 통 해 설명 합 니 다.파일 에 네 임 스페이스 가 포함 되 어 있다 면 다른 모든 코드 전에 네 임 스페이스 를 밝 혀 야 합 니 다.문법 형식 은 다음 과 같다.
<?php
// 'MyProject'
namespace MyProject;
// ... ...
같은 파일 에서 다른 네 임 스페이스 코드 를 정의 할 수 있 습 니 다.예 를 들 어:
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
이 문법 을 사용 하여 한 파일 에 여러 개의 네 임 스페이스 를 정의 하 는 것 을 권장 하지 않 습 니 다.아래 의 대괄호 형식의 문법 을 사용 하 는 것 을 권장 합 니 다.
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
전역 적 인 비 네 임 스페이스 의 코드 를 네 임 스페이스 의 코드 와 조합 하면 괄호 형식의 문법 만 사용 할 수 있 습 니 다.전역 코드 는 이름 이 없 는 namespace 문 구 를 괄호 로 묶 어야 합 니 다.예 를 들 어:
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { //
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
네 임 스페이스 를 설명 하기 전에 유일한 합 법 적 인 코드 는 원본 파일 인 코딩 방식 을 정의 하 는 declare 문 구 였 습 니 다.모든 비 PHP 코드 는 공백 부 호 를 포함 하여 네 임 스페이스 의 성명 전에 나타 날 수 없습니다.
<?php
declare(encoding='UTF-8'); //
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { //
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
다음 코드 에 문법 오류 가 발생 할 수 있 습 니 다.
<html>
<?php
namespace MyProject; // “<html>” -
?>
하위 이름 공간디 렉 터 리 와 파일 의 관계 가 매우 비슷 하 며,PHP 네 임 스페이스 도 계층 화 된 네 임 스페이스 의 이름 을 지정 할 수 있 습 니 다.따라서 네 임 스페이스 의 이름 은 차원 별로 정의 할 수 있 습 니 다.
<?php
namespace MyProject\Sub\Level; //
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
위의 예 는 상수 MyProject\Sub\Level\\CONNECT 를 만 들 었 습 니 다.OK,클래스 MyProject\\Sub\Level\Connection 과 함수 MyProject\\Sub\\Level\\Connect.네 임 스페이스 사용
PHP 네 임 스페이스 의 클래스 이름 은 세 가지 방식 으로 참조 할 수 있 습 니 다.
file1.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() {}
}
/* */
foo(); // Foo\Bar\foo
foo::staticmethod(); // Foo\Bar\foo , staticmethod
echo FOO; // Foo\Bar\FOO
/* */
subnamespace\foo(); // Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo,
// staticmethod
echo subnamespace\FOO; // Foo\Bar\subnamespace\FOO
/* */
\Foo\Bar\foo(); // Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // Foo\Bar\foo, staticmethod
echo \Foo\Bar\FOO; // Foo\Bar\FOO
?>
임의의 전역 클래스,함수 또는 상수 에 접근 하 는 것 을 주의 하 십시오.예 를 들 어\strlen()또는\\Exception 또는\INI 를 사용 할 수 있 습 니 다.ALL。네 임 스페이스 내부 에서 전역 클래스,함수,상수 에 접근 하기:
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // strlen
$b = \INI_ALL; // INI_ALL
$c = new \Exception('error'); // Exception
?>
네 임 스페이스 와 동적 언어 특징PHP 네 임 스페이스 의 실현 은 언어 자체 의 동적 특징의 영향 을 받는다.따라서 아래 코드 를 네 임 스페이스 로 변환 하려 면 동적 접근 요소 입 니 다.
example 1.php 파일 코드:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"
";
}
}
function funcname()
{
echo __FUNCTION__,"
";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "
"; // prints global
?>
이름 을 완전히 제한 해 야 합 니 다.동적 클래스 이름,함수 이름 또는 상수 이름 에서 이름 을 제한 하 는 것 과 이름 을 완전히 제한 하 는 것 은 다 르 지 않 기 때문에 선도 적 인 역 슬 래 쉬 는 불필요 합 니 다.동적 접근 네 임 스페이스 요소
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"
";
}
}
function funcname()
{
echo __FUNCTION__,"
";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // classname::__construct
$b = 'funcname';
$b(); //
echo constant('constname'), "
"; // global
/* , "\
amespacename\\classname"*/
$a = '
amespacename\classname';
$obj = new $a; // namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // namespacename\funcname
$b = '
amespacename\funcname';
$b(); // namespacename\funcname
echo constant('
amespacename\constname'), "
"; // namespaced
echo constant('namespacename\constname'), "
"; // namespaced
?>
namespace 키워드 와NAMESPACE__상수PHP 는 현재 네 임 스페이스 내부 요 소 를 추상 적 으로 접근 하 는 두 가지 방법 을 지원 합 니 다.NAMESPACE__ 마술 상수 와 namespace 키워드.
상수NAMESPACE__현재 네 임 스페이스 이름 을 포함 하 는 문자열 입 니 다.전역 적 으로 네 임 스페이스 에 있 는 코드 는 포함 되 지 않 으 며 빈 문자열 을 포함 합 니 다.
__NAMESPACE__ 예제,네 임 스페이스 에서 의 코드
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // "MyProject"
?>
__NAMESPACE__ 예제
<?php
echo '"', __NAMESPACE__, '"'; // ""
?>
상수NAMESPACE__ 동적 으로 이름 을 만 들 때 유용 합 니 다.예 를 들 어:사용NAMESPACE__동적 생 성 이름
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
키워드 namespace 는 현재 네 임 스페이스 나 하위 네 임 스페이스 의 요 소 를 명시 적 으로 방문 할 수 있 습 니 다.그것 은 클래스 의 self 연산 자 와 같다.namespace 연산 자,네 임 스페이스 의 코드
<?php
namespace MyProject;
use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function blah\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>
namespace 연산 자,전역 코드
<?php
namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname
$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>
네 임 스페이스 사용:별명/가 져 오기PHP 네 임 스페이스 는 두 가지 별명 이나 가 져 오 는 방식 을 지원 합 니 다.클래스 이름 에 별명 을 사용 하거나 네 임 스페이스 이름 에 별명 을 사용 합 니 다.
PHP 에서 별명 은 연산 자 use 를 통 해 이 루어 집 니 다.다음은 가능 한 세 가지 가 져 오기 방식 을 사용 하 는 예 입 니 다.
1.use 연산 자 를 사용 하여 별명 가 져 오기/사용
<?php
namespace foo;
use My\Full\Classname as Another;
// use My\Full\NSname as NSname
use My\Full\NSname;
//
use \ArrayObject;
$obj = new namespace\Another; // foo\Another
$obj = new Another; // My\Full\Classname
NSname\subns\func(); // My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // ArrayObject
// "use \ArrayObject" , foo\ArrayObject
?>
2.한 줄 에 여러 use 문 구 를 포함 합 니 다.
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // My\Full\Classname
NSname\subns\func(); // My\Full\NSname\subns\func
?>
가 져 오기 동작 은 컴 파일 에서 실행 되 지만 동적 클래스 이름,함수 이름 또는 상수 이름 은 아 닙 니 다.3.가 져 오기 와 동적 이름
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // My\Full\Classname
$a = 'Another';
$obj = new $a; // Another
?>
또한 가 져 오기 동작 은 비 한정 명칭 과 한정 명칭 에 만 영향 을 미친다.이름 을 완전히 제한 하 는 것 은 확실 하기 때문에 가 져 오 는 영향 을 받 지 않 습 니 다.4.가 져 오기 및 완전 한정 이름
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // My\Full\Classname
$obj = new \Another; // Another
$obj = new Another\thing; // My\Full\Classname\thing
$obj = new \Another\thing; // Another\thing
?>
네 임 스페이스 사용:전역 함수/상수 예비하나의 네 임 스페이스 에서 PHP 가 한정 되 지 않 은 클래스,함수 또는 상수 이름 을 만 났 을 때 다른 우선 정책 으로 이름 을 해석 합 니 다.클래스 이름 은 현재 네 임 스페이스 의 이름 을 항상 해석 합 니 다.따라서 시스템 내부 에 접근 하거나 네 임 스페이스 에 포함 되 지 않 은 클래스 이름 을 사용 할 때 완전히 제 한 된 이름 을 사용 해 야 합 니 다.예 를 들 어:
1.네 임 스페이스 에서 전역 클래스 에 접근
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a A\B\C\Exception
$b = new \Exception('hi'); // $b Exception
$c = new ArrayObject; // , A\B\C\ArrayObject
?>
함수 와 상수 의 경우 현재 네 임 스페이스 에 이 함수 나 상수 가 존재 하지 않 으 면 PHP 는 전역 공간의 함수 나 상수 로 물 러 갑 니 다.2.네 임 스페이스 에 준 비 된 전역 함수/상수
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "
"; // "45"
echo INI_ALL, "
"; // "7" - INI_ALL
echo strlen('hi'), "
"; // "1"
if (is_array('hi')) { // "is not array"
echo "is array
";
} else {
echo "is not array
";
}
?>
전역 공간네 임 스페이스 가 정의 되 지 않 으 면 모든 클래스 와 함수 의 정 의 는 전체 공간 에 있 습 니 다.PHP 가 네 임 스페이스 개념 을 도입 하기 전과 같 습 니 다.이름 앞 에 접 두 사 를 붙 여\\전역 공간의 이름 임 을 표시 합 니 다.이 이름 이 다른 네 임 스페이스 에 있 을 때 도 마찬가지 입 니 다.
전역 공간 설명 사용
<?php
namespace A\B\C;
/* A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // fopen
return $f;
}
?>
네 임 스페이스 순서네 임 스페이스 가 생 긴 후부 터 가장 실수 하기 쉬 운 것 은 종 류 를 사용 할 때 이런 경 로 를 찾 는 것 이 어떤 것 입 니까?
<?php
namespace A;
use B\D, C\E as F;
//
foo(); // "A" foo()
// "foo"
\foo(); // "foo"
my\foo(); // "A\my" "foo"
F(); // "A" "F"
// "F"
//
new B(); // "A" "B"
// , "A\B"
new D(); // , "B" "D"
// , "B\D"
new F(); // , "C" "E"
// , "C\E"
new \B(); // "B"
// , "B"
new \D(); // "D"
// , "D"
new \F(); // "F"
// , "F"
//
B\foo(); // "A\B" "foo"
B::foo(); // "A" "B" "foo"
// "A\B" , "A\B"
D::foo(); // , "B" "D" "foo"
// "B\D" , "B\D"
\B\foo(); // "B" "foo"
\B::foo(); // "B" "foo"
// "B" , "B"
//
A\B::foo(); // "A\A" "B" "foo"
// "A\A\B" , "A\A\B"
\A\B::foo(); // "A" "B" "foo"
// "A\B" , "A\B"
?>
이름 해석 은 다음 규칙 을 따 릅 니 다.1.이름 을 완전히 제한 하 는 함수,클래스 와 상수 의 호출 은 컴 파일 할 때 해석 합 니 다.예 를 들 어 new\A\B 는 클래스 A\B 로 분 석 됩 니 다.
2.모든 비 한정 명칭 과 한정 명칭(비 완전 한정 명칭)은 현재 가 져 오기 규칙 에 따라 컴 파일 할 때 변환 합 니 다.예 를 들 어 네 임 스페이스 A\B\C 가 C 로 가 져 오 면 C\D\e()에 대한 호출 은 A\B\C\D\e()로 전 환 됩 니 다.
3.네 임 스페이스 내부 에 가 져 오기 규칙 에 따라 바 뀌 지 않 은 모든 한정 이름 은 그 앞 에 현재 네 임 스페이스 이름 을 추가 합 니 다.예 를 들 어 네 임 스페이스 A\B 내부 에서 C\D\e()를 호출 하면 C\D\e()는 A\B\C\D\e()로 전 환 됩 니 다.
4.비 한정 클래스 이름 은 현재 가 져 오기 규칙 에 따라 컴 파일 할 때 변환 합 니 다(짧 은 가 져 오기 이름 대신 전체 이름 으로).예 를 들 어 네 임 스페이스 A\B\C 를 C 로 가 져 오 면 new C()는 new A\B\C()로 전 환 됩 니 다.
5.네 임 스페이스 내부(예 를 들 어 A\B)에서 한정 되 지 않 은 이름 의 함수 호출 은 실행 할 때 분 석 됩 니 다.예 를 들 어 함수 foo()호출 은 이렇게 해석 되 었 습 니 다.
현재 네 임 스페이스 에서 A\B\foo()라 는 함 수 를 찾 습 니 다전체(global)공간의 함수 foo()를 찾 고 호출 하려 고 시도 합 니 다.
6.네 임 스페이스(예 를 들 어 A\B)내부 에서 비 한정 이름 이나 한정 이름 클래스(비 완전 한정 이름)에 대한 호출 은 실행 할 때 분 석 됩 니 다.다음은 new C()및 new D\E()를 호출 하 는 분석 과정 입 니 다:new C()의 분석:
현재 네 임 스페이스 에서 A\B\C 클래스 를 찾 습 니 다클래스 A\B\C 를 자동 으로 불 러 오 려 고 시도 합 니 다.
new D\\E()의 해석:
전역 네 임 스페이스 의 전역 클래스 를 참조 하기 위해 서 는 완전히 제 한 된 이름 new\C()를 사용 해 야 합 니 다.
이상 은 PHP 네 임 스페이스(namespace)의 상세 한 내용 을 상세 하 게 분석 하 는 것 입 니 다.PHP 네 임 스페이스(namespace)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.