PHP 네임스페이스 소개

不言
풀어 주다: 2023-04-02 13:32:02
원래의
1228명이 탐색했습니다.

이 글은 주로 참고할 가치가 있는 PHP 네임스페이스를 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

PHP 네임스페이스란 무엇인가요?

(PHP 5 >= 5.3.0 , PHP 7)

네임스페이스란 무엇인가요? 광범위하게 말하면 네임스페이스는 사물을 캡슐화하는 방법입니다. 이 추상적인 개념은 여러 곳에서 찾아볼 수 있습니다. 예를 들어 디렉터리는 운영 체제에서 관련 파일을 그룹화하는 데 사용되며 디렉터리에 있는 파일의 네임스페이스 역할을 합니다. 예를 들어 foo.txt 파일은 /home/greg/home/other 디렉터리에 동시에 존재할 수 있지만 두 개의 foo.txt 파일이 동일한 디렉터리에 존재할 수는 없습니다. 또한 /home/greg 디렉터리 외부에서 foo.txt 파일에 액세스할 때 /home/greg/foo.txt를 얻으려면 파일 이름 앞에 디렉터리 이름과 디렉터리 구분 기호를 넣어야 합니다. 이 원칙을 프로그래밍 분야에 적용한 것이 네임스페이스의 개념입니다.

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

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

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

모든 합법적인 PHP 코드가 네임스페이스에 포함될 수 있지만 클래스(추상 클래스 및 특성 포함), 인터페이스, 함수 및 상수와 같은 유형의 코드만 네임스페이스의 영향을 받습니다.

네임스페이스는 namespace 키워드를 사용하여 선언됩니다. 파일에 네임스페이스가 포함된 경우 하나의 코드(declare 키워드)를 제외한 다른 모든 코드보다 먼저 네임스페이스를 선언해야 합니다.

네임스페이스를 선언하기 전에 유효한 유일한 코드는 소스 파일이 인코딩되는 방식을 정의하는 declare 문입니다. 또한 공백을 포함한 모든 비 PHP 코드는 네임스페이스 선언 앞에 나타날 수 없습니다:

<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>
로그인 후 복사

또한, PHP의 다른 언어 기능과 달리 동일한 네임스페이스는 여러 파일에 정의될 수 있으므로 동일한 이름이 허용됩니다. 공간의 내용은 나누어져 다른 파일에 저장됩니다.

1. 예제 1
먼저 두 개의 클래스 파일을 생성합니다.

a.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}
로그인 후 복사
로그인 후 복사

b.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}
로그인 후 복사
로그인 후 복사

index.php

<?php
require_once("a.php");
require_once("b.php");
로그인 후 복사

이제 index.php 파일을 실행합니다.

치명적인 오류를 발견하게 됩니다: 치명적인 오류: 클래스 테스트를 다시 선언할 수 없습니다. . . 분명히 Test 클래스는 두 번 도입했고 두 파일의 클래스 이름이 동일하여 충돌하기 때문에 다시 선언할 수 없습니다. 이때 이 문제를 해결하기 위해서는 네임스페이스가 필요하며, 용이하다.

2. 예제 2
이제 두 클래스 파일을 약간 수정합니다.

a.php

<?php
namespace demo1\a\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}
로그인 후 복사

b.php

<?php
namespace demo1\b\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}
로그인 후 복사

네임스페이스 키워드는 네임스페이스를 선언하는 데 사용됩니다. 이제 index.php를 실행하고 오류가 없는지 확인하세요. index.php를 수정하여 메서드 호출을 테스트하세요.

index.php

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a1->ceshi();
로그인 후 복사

이제 index.php 파일을 실행하세요

D:phpStudyWWWdemodemo1a.php

3. 예제 3

이제 또 다른 상황이 있습니다. 예를 들어, a.php에서 Test 클래스를 여러 번 인스턴스화해야 하는데 매번 전체 네임스페이스 정보를 작성하는 것이 번거롭다면 어떻게 해야 할까요? 하다? 예를 들면

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a2 = new demo1\a\Test\Test();
$a1->ceshi();echo '
'; $a2->ceshi();
로그인 후 복사

오류가 없더라도 더 번거로울 것입니다. 매번 전체 네임스페이스 이름을 작성해야 하며 오류도 없고 ctrl+c, ctrl+v도 가능하지만 별로 그렇지 않습니다. 아름답습니다(^_^).

이렇게 하면 됩니다

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
$a1 = new Test();
$a2 = new Test();
$a1->ceshi();
echo '
'; $a2->ceshi();
로그인 후 복사

use 키워드는 클래스를 소개하는 데 사용되며 네임스페이스를 사용하여 특정 클래스의 사용을 나타냅니다. 나중에 작업을 직접 인스턴스화할 수 있습니다

4.예제 5

그러면 다음과 같은 또 다른 질문이 나옵니다.

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test;
$a = new Test();
$b = new Test();
$a->ceshi();
echo '
'; $b->ceshi();
로그인 후 복사

이제 index.php 파일을 실행하세요

치명적인 오류 : Demo1bTestTest를 Test로 사용할 수 없습니다. 해당 이름은 이미 D:phpStudyWWWdemodemo1index.php 라인에서 사용 중이기 때문입니다. 5

네임스페이스를 사용하더라도 두 클래스 이름은 동일하기 때문에 둘 다 Test이고 프로그램입니다. 두 번째 테스트 클래스가 b.php의 테스트 클래스라는 것을 모르고 as 키워드

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$b = new bTest();
$a->ceshi();echo '
'; $b->ceshi();
로그인 후 복사

를 사용하면 as 키워드는 클래스 이름에 대한 별칭을 정의하므로 효과적으로 방지할 수 있습니다. Same name conflict

5. 예제 6

예를 들어, a.php와 같은 레벨에 전역 클래스 파일을 생성합니다: c.php:

c.php

<?php
class Test{    
public function ceshi(){        
echo __FILE__;
    }
}
로그인 후 복사

在index.php文件中这样做即可调用c.php中的test方法

<?php
require_once("a.php");
require_once("b.php");
require_once("c.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$a->ceshi();
echo '
'; $b = new bTest(); $b->ceshi(); echo '
'; $c = new \Test(); $c->ceshi(); echo '
';
로그인 후 복사

我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\” 

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP多态的理解

PHP文件编程的介绍

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

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