什么是命名空间?php命名空间的基本应用分享
什么是命名空间?
php中声明的函数名、类名和常量的名称,在同一次运行中是不能重复的,否则会产生一个致命的错误,常见的解决方法是约定一个前缀。例如 ,在项目开发时,用户 User 模块中的控制器和数据模型都声明同类的 User 类是不行的,需要在类名前面加上各自的功能前缀。可以将在控制器中的 User 类 命名为 ActUser类,在数据模型中的 User 类 命名为 ModelUser类。虽然通过增加前缀可以解决这个问题,但名字变得太长,就意味着开发时会编写更多的代码。 在php5.3以后的版本中,增加了很多其他高级语言(如 Java,C#等)使用很成熟的功能 ----- 命名空间,它的一个最明确的目的就是解决重名问题。命名空间将代码划分出不同的区域,每个区域的常量、函数和类的名字互不影响。
注意:常量从PHP5.3开始有了新的变化,可以使用 const 关键字在类的外部声明常量。虽然 const 和 define 都是用来声明常量的,但是在命名空间里, define 的作用是全局的,而 const 则作用于当前空间。这里提到的常量是指使用 const 声明的常量。
命名空间的作用和功能都很强大,在写插件或者通用库的时候再也不用担心重名问题。不过如果项目进行到一定的程度,要通过增加命名空间去解决重名问题,工作量不会比重构名字少。因此,从项目一开始的时候就应该很好的规划并指定一个命名规范。
命名空间的基本应用
默认情况下,所有的 PHP 中常量、类和函数的声明都放在全局空间下。 php5.3以后的版本有了独自的空间声明,不同空间中的相同命名是不会冲突的。独立的命名空间使用 namespace 关键字声明。
其代码如下所示:
<?php //声明这段代码的命名空间 namespace abc; // 这里是代码 ?>
注意:namespace 需要写在 PHP 脚本的顶部,必须是第一个 PHP 指令,不要再 namespace 前面出现非 PHP代码、HTML或者空格之类。
从代码 namespace abc 开始,到下一个 namespac 出现之前或者脚本运行结束是一个独立的空间,将这个空间命名为 abc 。
如果你为相同代码前澳命名空间或定义多个命名空间是不可能的,如果有多个 namespace 一起使用,则只有最后一个命名空间才能被识别,但你可以在同一个文件中定义不同的命名空间代码。
其代码如下所示:
<?php
namespace project1;
class user{
//此 user 属于project1 空间的类
}
namespace project2;
class user{
//此 user 属于project2 空间的类
}
// 上面的替代语法,另一种声明方法
namespace project3{
//命名空间 project3 下的代码
}
?>
上面的代码虽然可行,不同命名空间下使用各自的 user 类,但建议为每个独立的文件只定义一个命名空间,这样的代码可读性才是最好的。在相同的空间可以直接调用自己空间下的任何元素,而在不同空间之间是不可以直接调用其他空间元素的,需要使用命名空间的语法。其代码如下所示:
<?php
namespace project1;
const test = "这是一个常量<br>";
function demo(){
echo "这是一个函数<br>";
}
class user {
function fun(){
echo "这是一个 user 类";
}
}
echo test; //在自己的命名空间中直接使用常量
demo(); //在自己的命名空间中直接调用函数
/*************** project2 ******************/
namespace project2;
const test2 = "这也是一个常量<br>";
echo test2;
\project1\demo(); //调用 project1 空间中的 demo()
$user = new\project1\user(); //使用 project1 空间的类实例化对象
$user->fun();
?>
上例中声明了两个空间 project1 和 project2,在自己的空间中可以直接调用本空间中声明的元素,而在 project2 中调用 project1 中的元素时,使用了一种类似文件路径的语法 \空间名\元素名,对于类、函数和常量的用发是一样的。
什么是命名空间?php命名空间的基本应用分享的更多相关文章
- JAXB命名空间及命名空间前缀处理
本篇介绍下JAXB进阶使用,命名空间处理 使用package-info.java添加默认命名空间在需要添加命名空间的包下面添加package-info.java文件,然后添加@XmlSchema注解, ...
- XAML 命名空间和命名空间映射
本主题将介绍大部分 XAML 文件的根元素中存在的 XML/XAML 命名空间 (xmlns) 映射.它还将介绍如何为自定义类型和程序集生成类似的映射. XAML 命名空间如何与代码定义和类型库相关 ...
- jQuery事件命名空间多事件绑定自定义事件js 命名空间 javascript命名空间
http://blog.csdn.net/pigpigpig4587/article/details/24727791 jQuery事件命名空间 jQuery支持事件命名空间,以方便事件管理.例如,在 ...
- thinkphp 命名空间
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文 ...
- jquery的事件命名空间详解
jquery现在的事件API:on,off,trigger支持带命名空间的事件,当事件有了命名空间,就可以有效地管理同一事件的不同监听器,在定义组件的时候,能够避免同一元素应用到不同组件时,同一事件类 ...
- JavaScript之命名空间模式 浅析
来源于:http://www.cnblogs.com/syfwhu/p/4885628.html 前言 命名空间可以被认为是唯一标识符下代码的逻辑分组.为什么会出现命名空间这一概念呢?因为可用的单词数 ...
- struts2学习笔记之九:struts2的命名空间
struts2的命名空间适用于多人开发,根据不同模块命名不同的命名空间,方便开发和管理 struts2如果没有配置命名空间,默认命名空间为"/",Struts2中Action的完整 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- PHP命名空间入门教程
PHP5.3当中就引入了“命名空间”的概念,一直都没怎么关注和使用,其实学习它也挺简单的,看官方的教程就行了: 命名空间概述 定义命名空间 定义子命名空间 在同一个文件中定义多个命名空间 使用命名空间 ...
- 【python】lxml处理命名空间
有如下xml <A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dat ...
随机推荐
- 微信小程序生成带参数的二维码 小程序二维码
我是用php写的 先按照要求生成accesstoken $tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=clien ...
- asp.net 未能加载文件或程序集“WebApi”或它的某一个依赖项。试图加载格式不正确的程序。
http://blog.csdn.net/lingxyd_0/article/details/43155039 一般情况下出现这样的问题是因为.dll文件不存在或者路径不正确.但今天我遇到的情况都不在 ...
- Spark源码剖析(八):stage划分原理与源码剖析
引言 对于Spark开发人员来说,了解stage的划分算法可以让你知道自己编写的spark application被划分为几个job,每个job被划分为几个stage,每个stage包括了你的哪些代码 ...
- PAGELATCH_x 等待--转载
转自出处:http://www.cnblogs.com/xwdreamer/archive/2012/08/30/2663232.html 0.参考文献 Microsoft SQL Server企业级 ...
- 《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
看<Python cookbook>的时候,第9.5部分,"定义一个属性可由用户修改的装饰器",有个装饰器理解起来花了一些时间,做个笔记免得二刷这本书的时候忘了 完整代 ...
- Python 词云分析周杰伦《晴天》
一.前言满天星辰的夜晚,他们相遇了...夏天的时候,她慢慢的接近他,关心他,为他付出一切:秋天的时候,两个人终於如愿的在一起,分享一切快乐的时光但终究是快乐时光短暂,因为杰伦必须出国深造,两人面临了要 ...
- 微信支付接口开发之---微信支付之JSSDK(公众号支付)步骤
1.准备 1.1.公众号为服务号,开通微信支付功能 1.2.为了方便调试微信后台的回调URL(必须为外网),我用了nat123软件来做一个映射 1.3.官方微信开发的示例WxP ...
- centos6.5 redis搭建
redis安装1.wget http://download.redis.io/redis-stable.tar.gz2.tar -zxvf redis-stable.tar.gz3.cd redis- ...
- python3之内置函数
1.abs() 取数字的绝对值 >>> print(abs(-28)) 28 >>> print(abs(-2.34)) 2.34 >>> pri ...
- unity3d ipv6支持
unity游戏应用提交app stroe需要通过ipv6测试,但是unity本身我没找到可用的接口,所以使用ios插件来处理. 插件的IOSNativeNet.h和IOSNativeNet.m代码: ...