php教程 php手册 PHP 5.3 的重要特性:命名空间

PHP 5.3 的重要特性:命名空间

Jun 21, 2016 am 08:56 AM
module project user

PHP 5.3 的一个新的重要特性就是 命名空间(namespace)。
这一特性在 PHP5.0x 时候就提出过,后来被取消并安排在 PHP6 中实现。而此次又再次“提前”到了 PHP 5.3 发布,可见开发人员对其的重视以及谨慎的态度。

官方发布时说明文档的内容可能已过期(documentation maybe out dated),所以在这里简单的说明命名空间的用法:首先是声明一个命名空间,加入了新的关键字 namespace ,其应在类文件的开头

1
2
3
4
5
6
7
8
로그인 후 복사
<span style="FONT-WEIGHT: bold; COLOR: #000000"><?php</span>    
namespace Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">;</span> 
<span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> User <span style="COLOR: #009900">{</span>  <span style="FONT-WEIGHT: bold; COLOR: #000000">const</span> STATUS_OK <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">true</span><span style="COLOR: #339933">;</span> 
<span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> register<span style="COLOR: #009900">(</span><span style="COLOR: #000088">$data</span><span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span> 
<span style="COLOR: #339933">...</span>  <span style="COLOR: #009900">}</span> 
<span style="COLOR: #339933">...</span> 
<span style="COLOR: #009900">}</span>
<span style="FONT-WEIGHT: bold; COLOR: #000000">?></span>
로그인 후 복사

然后在控制器中(可能是其他文件)就可以这样调用

1
2
로그인 후 복사
로그인 후 복사
로그인 후 복사
<span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span>    
<span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span>
로그인 후 복사

的确与平常的并无两样,但是我们可以将两个相互独立的类联系起来。比如

1
2
로그인 후 복사
로그인 후 복사
로그인 후 복사
Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">;</span>    
Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">Blog</span><span style="COLOR: #339933">;</span>
로그인 후 복사

这样就能从语言本身更容易描述和理解变量、类之间的关系,从而避免了“传统”上的 Project_Module_Blog 这样冗长的命名方式。
上面的说明可能很难说明使用命名空间带来了什么好处,新增加的 use 和 as 关键字或许能更好的说明问题。use 和 as 语句可以引用和声明 命名空间的“别名”。比如,上述的控制器中实例化类的代码可以这样写

1
2
3
로그인 후 복사
로그인 후 복사
로그인 후 복사
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">;</span>    
<span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Module<span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> 
<span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span>
로그인 후 복사

甚至

1
2
3
로그인 후 복사
로그인 후 복사
로그인 후 복사
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span> <span style="COLOR: #b1b100">as</span> ModuleUser<span style="COLOR: #339933">;</span>    
<span style="COLOR: #000088">$user</span> <span style="COLOR: #339933">=</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> ModuleUser<span style="COLOR: #339933">;</span> 
<span style="COLOR: #000088">$user</span><span style="COLOR: #339933">-></span><span style="COLOR: #004000">register</span><span style="COLOR: #009900">(</span><span style="COLOR: #000088">$register_info</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span>
로그인 후 복사

类中的常量也可以通过命名空间访问,比如上述类中的 STATUS_OK 就可以通过命名空间

1
로그인 후 복사
로그인 후 복사
Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">STATUS_OK</span>
로그인 후 복사

访问。进一步的,也可以用别名简化那么长的“变量名称”

1
2
로그인 후 복사
로그인 후 복사
로그인 후 복사
use Project<span style="COLOR: #339933">::</span><span style="COLOR: #004000">Module</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">User</span><span style="COLOR: #339933">::</span><span style="COLOR: #004000">STATUS_OK</span> as STATUS_OK;    
echo STATUS_OK;
로그인 후 복사

顺便提下“超空间(The Global Namespace)”的概念。所谓的“超空间”,就是没有指定命名空间的变量、类和函数。比如

1
2
3
로그인 후 복사
로그인 후 복사
로그인 후 복사
<span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> foo<span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span>    
<span style="COLOR: #339933">...</span> 
<span style="COLOR: #009900">}</span>
로그인 후 복사

这的函数,可以使用 foo() 执行的同时,也可以使用 ::foo(); 这样执行。

最后,配合使用 autoload 函数即可载入指定命名空间的类。简单的函数如下

1
2
3
4
5
로그인 후 복사
<span style="FONT-WEIGHT: bold; COLOR: #000000">function</span> __autoload<span style="COLOR: #009900">(</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span> <span style="COLOR: #009900">{</span>    
<span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">=</span> <span style="COLOR: #990000">strtolower</span><span style="COLOR: #009900">(</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> 
<span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">=</span> <span style="COLOR: #990000">str_replace</span><span style="COLOR: #009900">(</span> <span style="COLOR: #0000ff">'::'</span><span style="COLOR: #339933">,</span> DIRECTORY_SEPARATOR<span style="COLOR: #339933">,</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> 
<span style="COLOR: #b1b100">require_once</span><span style="COLOR: #009900">(</span> <span style="COLOR: #990000">dirname</span><span style="COLOR: #009900">(</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">__FILE__</span> <span style="COLOR: #009900">)</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #0000ff">'/'</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #000088">$classname</span> <span style="COLOR: #339933">.</span> <span style="COLOR: #0000ff">'.class.php'</span> <span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span> 
<span style="COLOR: #009900">}</span>
로그인 후 복사

这样,比如调用

1
로그인 후 복사
로그인 후 복사
__autoload<span style="COLOR: #009900">(</span><span style="COLOR: #0000ff">'Project::Module::User'</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span>
로그인 후 복사

就可以自动载入 Project_Module_User.class.php 文件(虽然这样看起来并不方便多少)。



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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

ModuleNotFoundError: Python 모듈을 찾을 수 없음 오류를 해결하는 방법은 무엇입니까? ModuleNotFoundError: Python 모듈을 찾을 수 없음 오류를 해결하는 방법은 무엇입니까? Jun 25, 2023 pm 09:30 PM

Python 개발 과정에서 모듈을 찾을 수 없다는 오류가 자주 발생합니다. 이 오류의 구체적인 표현은 Python이 모듈을 가져올 때 ModuleNotFoundError 또는 ImportError라는 두 가지 오류 중 하나를 보고한다는 것입니다. 이 오류는 매우 짜증나고 프로그램이 제대로 실행되지 않을 수 있으므로 이 기사에서는 이 오류의 원인과 해결 방법을 살펴보겠습니다. Pyth의 ModuleNotFoundError 및 ImportError

Java9 새로운 기능 모듈 모듈식 프로그래밍 방법 Java9 새로운 기능 모듈 모듈식 프로그래밍 방법 May 19, 2023 pm 01:51 PM

Java9 버전에서 Java 언어는 모듈이라는 매우 중요한 개념을 도입했습니다. JavaScript 코드의 모듈식 관리에 익숙하다면 Java 9의 모듈식 관리를 보면 익숙할 것입니다. 1. 자바 모듈이란 무엇입니까? Java의 패키지와 다소 유사하게 모듈은 또 다른 수준의 Java 코드 그룹화를 도입합니다. 이러한 각 그룹(모듈)에는 많은 하위 패키지가 포함되어 있습니다. 모듈의 소스 코드 파일 패키지 루트에 module-info.java 파일을 추가하여 폴더와 해당 하위 폴더를 모듈로 선언합니다. 파일 구문

Docker 마운트 디렉토리 권한 문제를 해결하는 방법 Docker 마운트 디렉토리 권한 문제를 해결하는 방법 Feb 29, 2024 am 10:04 AM

Docker에서 탑재 디렉터리의 권한 문제는 일반적으로 탑재 디렉터리를 지정하기 위해 -v 매개 변수를 사용할 때 권한 관련 옵션을 추가하는 방법으로 해결됩니다. 마운트된 디렉토리 뒤에 ro 또는 :rw를 추가하여 마운트된 디렉토리의 권한을 지정할 수 있습니다. 이는 각각 읽기 전용 및 읽기-쓰기 권한을 나타냅니다. 예: dockerrun-v/host/path:/container/path:roimage_name 컨테이너 내부 작업이 권한 요구 사항을 준수하는지 확인하기 위해 컨테이너에서 실행 중인 사용자를 지정하려면 Dockerfile에서 USER 지시어를 정의하세요. 예: FROMimage_name#CreateanewuserRUNuseradd-ms/bin/

Linux 시스템에서 ntfs 디스크를 마운트할 때 '모듈 퓨즈를 찾을 수 없음' 문제를 해결하는 방법은 무엇입니까? Linux 시스템에서 ntfs 디스크를 마운트할 때 '모듈 퓨즈를 찾을 수 없음' 문제를 해결하는 방법은 무엇입니까? Dec 31, 2023 pm 03:17 PM

1. 먼저 Linux 시스템 커널 [root@localhost~]#uname-r-p2.6.18-194.el5i6862를 확인하여 http://sourceforge.net/projects/linux-ntfs/files/로 이동하여 rpm 패키지를 다운로드합니다. 해당 커널 중 정확히 동일한 커널을 찾을 수 없으면 가장 가까운 커널을 찾을 수 있습니다. 내가 다운로드한 것과 똑같은 것을 찾을 수 없습니다: kernel-module-ntfs-2.6.18-128.1.1.el5-2.1.27-0.rr.10.11.i686.rpm3 rpm 패키지를 설치합니다. -ivhkernel -m

Vuex 모듈 - 상태 웨어하우스 파티셔닝 사용 소개 Vuex 모듈 - 상태 웨어하우스 파티셔닝 사용 소개 Aug 10, 2022 pm 04:01 PM

Vuex는 주로 State, Getter, Mutation, Action 및 Module의 다섯 가지 부분으로 구성됩니다. 아래에서는 Vuex 모듈 상태 웨어하우스 분할을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다.

Python의 OS 모듈 및 예제를 사용하는 방법 Python의 OS 모듈 및 예제를 사용하는 방법 Apr 22, 2023 pm 10:19 PM

Python의 os 모듈은 운영 체제와 상호 작용하는 데 사용되는 표준 라이브러리 중 하나입니다. 이는 파일 및 디렉터리 작업에 유용한 많은 기능과 변수를 제공합니다. 다음은 몇 가지 일반적인 os 모듈 함수의 사용법입니다: 1. 현재 작업 디렉토리를 가져옵니다: importoscwd=os.getcwd()print(cwd) 2. 현재 작업 디렉토리를 전환합니다: importosos.chdir('/path/to/new /directory' )3. 디렉토리의 모든 파일과 하위 디렉토리를 나열합니다: importosfiles=os.listdir('/path/to/dire

1986년 Apple IIGS 키보드에 DIY 프로젝트에 무선 연결, OLED 디스플레이 탑재 1986년 Apple IIGS 키보드에 DIY 프로젝트에 무선 연결, OLED 디스플레이 탑재 Sep 28, 2024 am 06:07 AM

기술적으로 기계식은 아니지만 최근 몇 년 동안 전자 폐기물에서 진정한 괴짜 금으로 변한 IBM Model M과 같은 복고풍 기계식 키보드가 요즘 대세입니다. 그러나 모델 M만이 매력적인 키보드는 아닙니다.

Modder는 완벽한 리버스 엔지니어링과 현대적인 기능을 통해 1986년 Apple IIGS 키보드를 무선으로 전환했습니다. Modder는 완벽한 리버스 엔지니어링과 현대적인 기능을 통해 1986년 Apple IIGS 키보드를 무선으로 전환했습니다. Sep 27, 2024 pm 03:02 PM

기술적으로 기계식은 아니지만 최근 몇 년 동안 전자 폐기물에서 진정한 괴짜 금으로 변한 IBM Model M과 같은 복고풍 기계식 키보드가 요즘 대세입니다. 그러나 모델 M만이 매력적인 키보드는 아닙니다.

See all articles