php高级程序设计 学习笔记 2014.06.12
命名空间概述
PHP 在 5.3.0 以后的版本开始支持命名空间。什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面是一个说明 PHP 命名空间语法的示例:
定义命名空间
立即学习“PHP免费学习笔记(深入)”;
虽然任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。当然你也可以在同一个文件中定义多个命名空间。
<span>namespace</span><span> MyProject;
</span><span>class</span><span> MyClass
{
#code...
}</span>定义子命名空间:与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<span>namespace</span><span> MyProject\helper\http;
</span><span>class</span><span> MyClass
{
#code...
}</span>在同一个文件中定义多个命名空间:在同一个文件中声明多个命名空间有两种方式,不过在实际编程实践中,非常不提倡在同一个文件中定义多戈命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。下面列出第一种方法。
<span>namespace</span><span> MyProject\helper\http;
</span><span>class</span><span> MyClass
{
#code...
}
</span><span>namespace</span><span> MyProject\helper\request;
</span><span>class</span><span> MyClass
{
#code...
}</span>不过强烈不建议使用这种方法,可以参考下面的大括号定义法:
乐尚商城系统是一项基于PHP+MYSQL为核心开发的一套免费 + 开源专业商城系统。软件具执行效率高、模板自由切换、后台管理功能方便等诸多优秀特点。 本软件是基于Web应用的B/S架构的商城网站建设解决方案的建站系统。它可以让用户高效、快速、低成本的构建个性化、专业化、强大功能的团购网站。从技术层面来看,本程序采用目前软件开发IT业界较为流行的PHP和MYSQL数据库开发技术,基于面向对象的编程
684
<span>namespace</span><span> MyProject\helper\http;
{
</span><span>class</span><span> MyClass
{
#code...
}
}
</span><span>namespace</span><span> MyProject\helper\request;
{
</span><span>class</span><span> MyClass
{
#code...
}
}</span>PHP 命名空间中的元素使用
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。类名可以通过三种方式引用:
使用命名空间:别名/导入
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。在PHP中,别名是通过操作符 use 来实现的。
注意PHP不支持导入函数或常量。
<span>namespace</span><span> foo; use My\Full\Classname </span><span>as</span><span> Another; </span><span>//</span><span> 下面的例子与 use My\Full\NSname as NSname 相同</span> <span>use My\Full\NSname; </span><span>//</span><span> 导入一个全局类</span> use \ArrayObject;
名称解析规则
在说明名称解析规则之前,我们先看一些重要的定义:
名称解析遵循下列规则:
Example 名称解析示例
<?<span>php
namespace A;
</span><span>use</span> B\D, C\E <span>as</span><span> F;
</span><span>//</span><span> 函数调用</span>
<span>
foo(); </span><span>//</span><span> 首先尝试调用定义在命名空间"A"中的函数foo()
// 再尝试调用全局函数 "foo"</span>
<span>
\foo(); </span><span>//</span><span> 调用全局空间函数 "foo" </span>
<span>
my\foo(); </span><span>//</span><span> 调用定义在命名空间"A\my"中函数 "foo" </span>
<span>
F(); </span><span>//</span><span> 首先尝试调用定义在命名空间"A"中的函数 "F"
// 再尝试调用全局函数 "F"
// 类引用</span>
<span>new</span> B(); <span>//</span><span> 创建命名空间 "A" 中定义的类 "B" 的一个对象
// 如果未找到,则尝试自动装载类 "A\B"</span>
<span>new</span> D(); <span>//</span><span> 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
// 如果未找到,则尝试自动装载类 "B\D"</span>
<span>new</span> F(); <span>//</span><span> 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
// 如果未找到,则尝试自动装载类 "C\E"</span>
<span>new</span> \B(); <span>//</span><span> 创建定义在全局空间中的类 "B" 的一个对象
// 如果未发现,则尝试自动装载类 "B"</span>
<span>new</span> \D(); <span>//</span><span> 创建定义在全局空间中的类 "D" 的一个对象
// 如果未发现,则尝试自动装载类 "D"</span>
<span>new</span> \F(); <span>//</span><span> 创建定义在全局空间中的类 "F" 的一个对象
// 如果未发现,则尝试自动装载类 "F"
// 调用另一个命名空间中的静态方法或命名空间函数</span>
<span>
B\foo(); </span><span>//</span><span> 调用命名空间 "A\B" 中函数 "foo"</span>
<span>
B</span>::foo(); <span>//</span><span> 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"</span>
<span>
D</span>::foo(); <span>//</span><span> 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
// 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"</span>
<span>
\B\foo(); </span><span>//</span><span> 调用命名空间 "B" 中的函数 "foo" </span>
<span>
\B</span>::foo(); <span>//</span><span> 调用全局空间中的类 "B" 的 "foo" 方法
// 如果类 "B" 未找到,则尝试自动装载类 "B"
// 当前命名空间中的静态方法或函数</span>
<span>
A\B</span>::foo(); <span>//</span><span> 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"</span>
<span>
\A\B</span>::foo(); <span>//</span><span> 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"</span>
?>
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号