>  기사  >  백엔드 개발  >  php 네임스페이스란 무엇인가요? 네임스페이스 사용 예에 ​​대한 자세한 설명

php 네임스페이스란 무엇인가요? 네임스페이스 사용 예에 ​​대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-06-30 09:23:211250검색

PHP는 5.3.0 이후 버전부터 namespace를 지원하기 시작합니다. 네임스페이스란 무엇입니까? 광범위하게 말하면 네임스페이스는 사물을 캡슐화하는 방법입니다. 이 추상적인 개념은 여러 곳에서 찾아볼 수 있습니다.

네임스페이스 개요

PHP에서 네임스페이스는 클래스 라이브러리나 애플리케이션을 작성할 때 클래스나 함수와 같은 재사용 가능한 코드를 만들 때 발생하는 두 가지 유형의 문제를 해결하는 데 사용됩니다.

사용자 작성 코드와 PHP 내부 클래스 간의 이름 충돌 /함수/상수 또는 타사 클래스/함수/상수.
매우 긴 식별자 이름(일반적으로 첫 번째 유형의 문제를 완화하기 위해 정의됨)에 대한 별칭(또는 짧은) 이름을 만들어 소스 코드의 가독성을 높입니다.
PHP 네임스페이스는 관련 클래스, 함수 및 상수를 그룹화하는 방법을 제공합니다. 다음은 PHP 네임스페이스 구문을 보여주는 예입니다.

네임스페이스 정의

모든 합법적인 PHP 코드가 네임스페이스에 포함될 수 있지만 네임스페이스의 영향을 받는 코드 유형은 클래스, 함수 세 가지뿐입니다. 그리고 상수. 네임스페이스는 키워드 네임스페이스를 사용하여 선언됩니다. 파일에 네임스페이스가 포함되어 있으면 다른 모든 코드보다 먼저 네임스페이스를 선언해야 합니다. 또한, PHP의 다른 언어 기능과 달리 동일한 네임스페이스를 여러 파일에 정의할 수 있으므로 동일한 네임스페이스의 내용을 나누어 다른 파일에 저장할 수 있습니다. 물론 동일한 파일에 여러 네임스페이스를 정의할 수도 있습니다.

namespace MyProject;
class MyClass
{
    #code...
}

하위 네임스페이스 정의: 디렉터리와 파일 간의 관계와 마찬가지로 PHP 네임스페이스를 사용하면 계층적 네임스페이스 이름을 지정할 수도 있습니다. 따라서 네임스페이스의 이름은 계층적 방식으로 정의될 수 있습니다:

namespace MyProject\helper\http;
class MyClass
{
    #code...
}

동일한 파일에 여러 네임스페이스 정의: 동일한 파일에 여러 네임스페이스를 선언하는 방법에는 두 가지가 있지만 실제 프로그래밍 실습에서는 다음과 같이 하는 것을 강력히 권장하지 않습니다. 동일한 파일에 Dogo 네임스페이스를 정의합니다. 이 방법은 주로 동일한 파일에 여러 PHP 스크립트를 결합하는 데 사용됩니다. 첫 번째 방법은 아래에 나열되어 있습니다.

namespace MyProject\helper\http;
class MyClass
{
    #code...
}
namespace MyProject\helper\request;
class MyClass
{
    #code...
}

그러나 이 방법은 사용하지 않는 것이 좋습니다. 다음 중괄호 정의 방법을 참조하세요.

namespace MyProject\helper\http;
{
    class MyClass
    {
        #code...
    }
}
namespace MyProject\helper\request;
{
    class MyClass
    {
        #code...
    }
}

PHP 네임스페이스의 요소 사용

네임스페이스 사용 방법을 논의하기 전에 PHP가 네임스페이스를 어떻게 인식하는지 이해해야 합니다. 무엇을 사용할지. 요소에 사용할 네임스페이스입니다. 클래스 이름은 세 가지 방법으로 참조할 수 있습니다:

정규화되지 않은 이름 또는 접두사가 없는 클래스 이름(예: $a=new foo(); 또는 foo::staticmethod();). 현재 네임스페이스가 currentnamespace이면 foo는 currentnamespacefoo로 확인됩니다. foo를 사용하는 코드가 전역 코드이고 어떤 네임스페이스에도 코드를 포함하지 않는 경우 foo는 foo로 확인됩니다. 경고: 네임스페이스의 함수 또는 상수가 정의되지 않은 경우 정규화되지 않은 함수 또는 상수 이름은 전역 함수 ​​이름 또는 상수 이름으로 확인됩니다. 자세한 내용은 네임스페이스 사용: 대체 전역 함수 이름/상수 이름을 참조하세요.

정식 이름 또는 접두사가 포함된 이름(예: $a = new subnamespacefoo(); 또는 subnamespacefoo::staticmethod();). 현재 네임스페이스가 currentnamespace이면 foo는 currentnamespacesubnamespacefoo로 확인됩니다. foo를 사용하는 코드가 전역 코드인 경우, 어떤 네임스페이스에도 포함되지 않은 코드인 foo는 subnamespacefoo로 확인됩니다.

정규화된 이름 또는 전역 접두사 operator를 포함하는 이름(예: $a = new currentnamespacefoo() 또는 currentnamespacefoo::staticmethod();). 이 경우 foo는 항상 코드에서 리터럴 이름 currentnamespacefoo로 확인됩니다.
네임스페이스 사용: 별칭/가져오기

별칭을 통해 외부 정규화된 이름을 참조하거나 가져올 수 있도록 허용하는 것은 네임스페이스의 중요한 기능입니다. PHP 네임스페이스 지원 별칭이나 가져오기를 사용하는 방법에는 클래스 이름에 별칭을 사용하거나 네임스페이스 이름에 별칭을 사용하는 두 가지 방법이 있습니다. PHP에서는 별칭이 연산자 사용을 통해 구현됩니다.

PHP는 가져온 함수나 상수를 지원하지 않습니다.

namespace foo;
use My\Full\Classname as Another;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 导入一个全局类
use \ArrayObject;

이름 확인 규칙

이름 확인 규칙을 설명하기 전에 몇 가지 중요한 정의를 살펴보겠습니다.

정식되지 않은 이름: Foo
정식 이름과 같이 이름에 네임스페이스 구분 기호가 포함되지 않은 식별자입니다. 이름에 FooBar와 같은 네임스페이스 구분 기호가 포함된 식별자. 정규화된 이름: 이름에 네임스페이스 구분 기호가 포함되어 있고 FooBar와 같은 네임스페이스 구분 기호로 시작하는 식별자입니다. 네임스페이스Foo는 정규화된 이름이기도 합니다.
이름 확인은 다음 규칙을 따릅니다.

对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。
所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
1) 在当前命名空间中查找名为 A\B\foo() 的函数
2) 尝试查找并调用 全局(global) 空间中的函数 foo()。
在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析:
在当前命名空间中查找A\B\C类。
尝试自动装载类A\B\C。

new D\E()的解析:
在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
尝试自动装载类 A\B\D\E。

为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。

Example 名称解析示例

<?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" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>


위 내용은 php 네임스페이스란 무엇인가요? 네임스페이스 사용 예에 ​​대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.