>  기사  >  백엔드 개발  >  편집자는 네임스페이스의 호출 순서를 알려줄 것입니다.

편집자는 네임스페이스의 호출 순서를 알려줄 것입니다.

醉折花枝作酒筹
醉折花枝作酒筹원래의
2021-07-30 16:31:081611검색

이전 글에서는 네임스페이스의 내부 요소에 액세스하는 방법을 배웠습니다. 필요한 경우 "편집기가 네임스페이스의 내부 요소에 액세스하는 방법(php 버전)"을 읽어보세요. 이번에는 네임스페이스의 순서를 소개하겠습니다. 필요하시면 참고하시면 됩니다.

먼저 작은 예를 살펴보겠습니다.

<?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"
?>

위의 작은 예를 주의 깊게 살펴보면 무엇을 관찰할 수 있나요? 당당, 지금부터 답변해드리겠습니다.

함수를 호출할 때 "foo()"만 쓰면 네임스페이스에 있는 함수가 먼저 호출된 다음 전역 함수가 호출되지만 "foo; () )", 이는 전역 함수만 호출합니다. foo()”,先调用的命名空间中的函数,然后在调用全局函数;但如果是“foo()”,这就只调用全局函数了。

在类应用的时候,如果我们写了“new B();”,将会创建命名空间中定义的类"B"的一个对象,但如果未找到,则尝试自动装载类"AB"。

在调用另一个命名空间中的静态方法或命名空间函数的时候,如何我们写了“Bfoo()”,这表明我们将调用命名空间中的函数“foo()”;但如果写的是“B::foo();”就不一样了,他先调用命名空间中的函数“foo()”,但如果未找到,则尝试自动装载类"AB"。

在当前命名空间中的静态方法或函数的时候,如何我们写了“AB::foo();

클래스 적용시 "new B();"라고 적으면 네임스페이스에 정의된 "B" 클래스의 객체가 생성되는데, 해당 객체가 없으면 자동으로 클래스 로드를 시도해보세요. "AB".

다른 네임스페이스에서 정적 메서드나 네임스페이스 함수를 호출할 때 "Bfoo()"라고 씁니다. 이는 " foo()" 네임스페이스에서 함수를 호출할 것임을 나타냅니다. >"; 그러나 "B::foo();"라고 쓰면 다릅니다. 먼저 네임스페이스에서 "foo()" 함수를 호출하지만 찾을 수 없으면 시도합니다. 클래스 "AB"를 자동 로드합니다.
  • 현재 네임스페이스에 정적 메서드나 함수를 작성할 때 "AB::foo();"를 작성합니다. 이는 "AA" 네임스페이스에 정의된 클래스를 호출할 것임을 나타냅니다. "B"의 "foo" 메소드는 클래스 "AAB"가 발견되지 않으면 자동으로 로드합니다.

    이제 요약해 보겠습니다.
  • 완전한 함수, 클래스 및 상수에 대한 호출은 컴파일 타임에 해결됩니다. 예를 들어 newaB는 클래스 aB로 확인됩니다.
  • 모든 정규화되지 않은 이름과 정규화된 이름(정규화되지 않은 이름)은 현재 가져오기 규칙에 따라 컴파일 타임에 변환됩니다. 예를 들어 네임스페이스 ABC를 C로 가져온 경우 CDe()에 대한 호출은 ABCDe()로 변환됩니다.
  • 모든 정규화되지 않은 이름과 정규화된 이름(완전히 정규화되지 않은 이름)은 현재 가져오기 규칙에 따라 컴파일 타임에 변환됩니다. 예를 들어 네임스페이스 aBC를 C로 가져오면 CDe()에 대한 호출이 aBCDe()로 변환됩니다.
  • 규정되지 않은 클래스 이름은 현재 가져오기 규칙(짧은 가져오기 이름을 전체 이름으로 대체)에 따라 컴파일 타임에 변환됩니다. 예를 들어 네임스페이스 aBC를 C로 가져오면 new C()가 new aBC()로 변환됩니다.
    • 네임스페이스(예: ab)에서 정규화되지 않은 이름에 대한 함수 호출은 런타임 시 해결됩니다. 예를 들어 foo() 함수 호출은 다음과 같이 구문 분석됩니다.

    • 현재 네임스페이스에서 ABfoo()라는 함수를 찾습니다.
  • 전역 공간에서 foo() 함수를 찾아 호출해 보세요.

    • 네임스페이스(예: ab) 내의 정규화되지 않은 이름 또는 정규화된 이름 클래스(정규화되지 않은 이름)에 대한 호출은 런타임 시 해결됩니다. 다음은 new c()와 new de()를 호출하는 파싱 과정이다. new c() 파싱:

    • 현재 네임스페이스에서 ABC 클래스를 찾는다.
  • ABC 클래스를 자동 로딩해 보세요.

    • new DE() 분석:

    • 클래스 이름 앞에 현재 네임스페이스 이름을 추가하여 ABDE가 되도록 한 다음 클래스를 검색합니다.
  • ABDE 클래스를 자동 로딩해 보세요.

글로벌 네임스페이스에서 글로벌 클래스를 참조하려면 정규화된 이름 new C()를 사용해야 합니다.

🎜🎜그게 다입니다. 더 알고 싶다면 여기를 클릭하세요. → →🎜php 비디오 튜토리얼🎜🎜

위 내용은 편집자는 네임스페이스의 호출 순서를 알려줄 것입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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