PHP 네임스페이스 인스턴스에 대한 자세한 설명

怪我咯
풀어 주다: 2023-03-13 20:36:01
원래의
1656명이 탐색했습니다.

PHP Namespace(네임스페이스)는 PHP 5.3에 추가되었습니다. C#과 Java를 공부했다면 네임스페이스는 새로운 것이 아닙니다. 그러나 이는 PHP에서 여전히 매우 중요한 의미를 갖습니다.

PHP 네임스페이스는 다음 두 가지 유형의 문제를 해결할 수 있습니다.

사용자가 작성한 코드와 PHP 내부 클래스/함수/상수 또는 타사 클래스/함수/상수 간의 이름 충돌.

매우 긴 식별자 이름(일반적으로 첫 번째 유형의 문제를 완화하기 위해 정의됨)에 대한 별칭(또는 짧은) 이름을 만들어 소스 코드의 가독성을 높입니다.

네임스페이스 정의

기본적으로 모든 상수, 클래스 및 함수 이름은 PHP가 네임스페이스를 지원하기 전과 마찬가지로 전역 공간에 배치됩니다.

네임스페이스는 키워드 네임스페이스로 선언됩니다. 파일에 네임스페이스가 포함되어 있으면 다른 모든 코드보다 먼저 네임스페이스를 선언해야 합니다.

네임스페이스 식별자를 참조하는 세 가지 방법

(1) 정규화된 이름

은 운영 체제의 절대 경로와 유사하며 완전한 경로이므로 이해 시 오해가 없습니다.

예를 들어 새 ABC에서 C는 AB 네임스페이스 아래의 C 클래스로 확인됩니다.

(2) 정규화된 이름

은 운영 체제의 상대 경로와 유사하며 이름의 일부를 포함하고 현재 네임스페이스를 참조합니다.

예를 들어 네임스페이스 A에서 BC()가 호출되면 최종 참조되는 네임스페이스는 ABC()입니다.

(3) 정규화되지 않은 이름

은 정규화된 이름과 유사하지만 하위 네임스페이스를 포함하지 않습니다.

예를 들어 AB 네임스페이스 아래에서 C()가 호출되면 최종 참조되는 네임스페이스는 ABC()입니다.

예를 통해 세 가지 참조 방법을 설명합니다.

namespace \Example;
require_once "fnction.php";
class ClassA {}
function Function() {}
//完全限定名称
\Example\Function();
\Example\B\Function(); 
//限定名称
B\Function(); //指向 \Example\B\Function();
//非限定名称
$test = new ClassA(); //resolves to \Example\ClassA
Function(); //指向 \Example\Function
로그인 후 복사

참고:

•네임스페이스 내부에서 현재 범위에 함수 및 상수 정의가 없으면 PHP는 오류를 보고하지 않습니다. 대신 전역 네임스페이스에서 찾으세요.

•네임스페이스 내부에서 현재 범위에 클래스 정의가 없으면 PHP는 오류를 직접 보고하고 해당 클래스를 찾기 위해 전역 범위로 이동하지 않으므로 내부 또는 사용자 정의 클래스를 참조해야 하는 경우 클래스의 경우 정규화된 이름을 사용해야 합니다.

간단한 예를 들어보겠습니다. 먼저 (네임스페이스에 정의된) 코드를 작성하고 이름을 function.php로 지정합니다.

namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() 
{
  return "foo\r\n";
}
class foo 
{
  static function staticmethod()
  {
    return METHOD . "\r\n" ;
  }
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}
로그인 후 복사

그런 다음 네임스페이스 아래에도 코드인 test.php를 작성합니다.

namespace secondsp;
include 'function.php';
class foo
{
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}
function is_file($file)
{
  return true ;
}
//非限定名称:实例化secondsp\foo类对象
$obj = new foo; 
echo $obj->foofunction();
//实例化Foo\Bar\subnamespace\foo 类对象
$obj = new Foo\Bar\subnamespace\foo ;
echo $obj->foofunction();
//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
//$obj = new ArrayObject(array(1)); 
$obj = new \ArrayObject(array(1)); 
//在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
echo strlen("nihao");
 //引用当前命名空间下的函数
var_dump(is_file('nihao')); //True
//引用全局函数
var_dump(\is_file('nihao')); //False
로그인 후 복사

Import, alias

사용할 네임스페이스 계층이 길고 많으면 사용하기가 특히 번거로우므로 use 키워드를 사용하여 네임스페이스, 클래스, 상수, 함수 등을 가져올 수 있으며, 그런 다음 직접 사용하십시오. 전체 이름을 인용하십시오. alias 키워드는 가져온 클래스와 함수의 이름을 바꿀 수 있습니다.

예를 들어, use 키워드를 사용하는 방법은 코드가 전역 네임스페이스에 있습니다:

include 'function.php';
use Foo\Bar\subnamespace\foo ;
$obj = new foo;
echo $obj->foofunction();
use Foo\Bar\subnamespace\foo as aliasfunname;
$obj = new aliasfunname;
echo $obj->foofunction();
use Foo\Bar\subnamespace ; 
$obj = new subnamespace\foo ;
echo $obj->foofunction();
use Foo\Bar\subnamespace as aliasname;
$obj = new aliasname\foo ;
echo $obj->foofunction();
//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
$obj = new ArrayObject(array(1)); 
//导入一个函数
use function Foo\Bar\subnamespace\foo  ;
echo foo();
use function Foo\Bar\subnamespace\foo as func;
echo func();
use const Foo\Bar\subnamespace\FOO;
//echo FOO;
로그인 후 복사

요약:

•Python과 달리 PHP의 네임스페이스는 의미론적 개념이며 구체적입니다. 코드의 위치와 레이아웃 즉, 네임스페이스를 사용하는 코드는 라이브러리 파일(모든 파일)을 자체적으로 가져와야 합니다. module 또는 package 를 사용하면 Python 파서는 패키지 또는 모든 모듈의 파일을 자동으로 가져옵니다.

•PHP에서는 범위 개념이 매우 약하며 전역 도메인과 로컬 도메인이 명확하게 구분됩니다. 예를 들어 전역 공간의 변수는 함수나 클래스에서 참조할 수 없습니다. 네임스페이스에서는 상황이 다릅니다. 네임스페이스를 정의하는 코드가 해당 네임스페이스에서 상수와 함수를 찾을 수 없으면 전역 상수와 함수를 사용하고 해당 네임스페이스에서 클래스를 찾을 수 없으면 자체 Define 클래스를 포함합니다. ), 코드는 오류를 직접 보고합니다.

•use 키워드를 통해 네임스페이스를 사용하는 경우 정규화된 이름(기호)을 통해 이를 가져올 필요가 없습니다. 왜냐하면 PHP는 이미 가져온 네임스페이스가 정규화된 네임스페이스라고 가정하기 때문입니다.

•use 키워드를 통해 상수, 함수, 클래스, 인터페이스 및 기타 네임스페이스를 가져올 수 있습니다.

•네임스페이스는 보다 효과적인 사용을 추구하기 위해서는 사용 사양과

자동 로딩 메커니즘이 있어야 합니다. 이것이 PSR-4 사양입니다.

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!