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 文件(虽然这样看起来并不方便多少)。

在Python的开发过程中,经常会遇到找不到模块的错误。这个错误的具体表现就是Python在导入模块的时候报出ModuleNotFoundError或者ImportError这两个错误之一。这种错误很困扰,会导致程序无法正常运行,因此在这篇文章里,我们将会探究这个错误的原因及其解决方法。ModuleNotFoundError和ImportError在Pyth

在Java9版本中Java语言引入了一个非常重要的概念:模块(module)。如果对javascript代码模块化管理比较熟悉的小伙伴,看到Java9的模块化管理,应该有似曾相识的感觉。一、什么是Javamodule?与Java中的package有些类似,module引入了Java代码分组的另一个级别。每个这样的分组(module)都包含许多子package包。通过在一个模块的源代码文件package的根部,添加文件module-info.java来声明该文件夹及其子文件夹为一个模块。该文件语法

在Docker中,挂载目录的权限问题通常可以通过以下方法解决:使用-v参数指定挂载目录时添加权限相关的选项。可以通过在挂载的目录后面添加:ro或:rw来指定挂载目录的权限,分别表示只读和读写权限。例如:dockerrun-v/host/path:/container/path:roimage_name在Dockerfile中定义USER指令来指定容器中运行的用户,以确保容器内部的操作符合权限要求。例如:FROMimage_name#CreateanewuserRUNuseradd-ms/bin/

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包rpm-ivhkernel-m

vuex主要包含以下五个部分:State、Getter 、Mutation 、Action 、Module ,下面就给大家介绍Vuex Module-状态仓库分割,希望对需要的朋友有所帮助!

Python的os模块是用于与操作系统进行交互的标准库之一,它提供了许多有用的函数和变量,以便处理文件和目录。下面是一些常见的os模块函数的用法:1.获取当前工作目录:importoscwd=os.getcwd()print(cwd)2.切换当前工作目录:importosos.chdir('/path/to/new/directory')3.列出目录中的所有文件和子目录:importosfiles=os.listdir('/path/to/dire

Retro mechanical keyboards are all the rage these days, with the likes of the IBM Model M — although not technically mechanical — having gone from e-waste to veritable geek gold in recent years. However, the Model M isn't the only attractive keyboard

Retro mechanical keyboards are all the rage these days, with the likes of the IBM Model M — although not technically mechanical — having gone from e-waste to veritable geek gold in recent years. However, the Model M isn't the only attractive keyboard


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。