PHP 为什么要使用命名空间,命名空间的作用
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。
举个栗子:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法,但是同时引入各自的Comment类显然是不行的,代码会出错,在另一个地方重写任何一个Comment也会降低维护性。那这时只能重构类名,我约定了一个命名规则,在类名前面加上模块名,像这样:Article_Comment、MessageBoard_Comment
可以看到,名字变得很长,那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且,以后如果要对各个模块增加更多的一些整合功能,或者是互相调用,发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题,并规定命名规则就能很好的避免这个问题。另一个解决方法可以考虑使用命名空间。
基础
命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。
创建一个命名空间需要使用namespace关键字,这样:
复制代码代码如下:
<?php
//创建一个名为'Article'的命名空间
namespace Article;
?>
要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:
复制代码代码如下:
//例一
//在脚本前面写了一些逻辑代码
<?php
$path = "/";
class Comment { }
namespace Article;
?>
//例二
//在脚本前面输出了一些字符
<html></html>
<?php
namespace Article;
?>
为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。
下面我创建了两个命名空间,顺便为这两个空间各自添加了一个Comment类元素:
复制代码代码如下:
<?php
//创建一个名为'Article'的命名空间
namespace Article;
//此Comment属于Article空间的元素
class Comment { }
//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;
//此Comment属于MessageBoard空间的元素
class Comment { }
?>
在不同空间之间不可以直接调用其它元素,需要使用命名空间的语法:
复制代码代码如下:
<?php
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();
//调用Article空间的Comment类
$article_comment = new \Article\Comment();
?>
可以看到,在MessageBoard空间中调用article空间里的Comment类时,使用了一种像文件路径的语法: \空间名\元素名
除了类之外,对函数和常量的用法是一样的,下面我为两个空间创建了新的元素,并在MessageBoard空间中输出了它们的值。
复制代码代码如下:
<?php
namespace Article;
const PATH = '/article';
function getCommentTotal() {
return 100;
}
class Comment { }
namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
return 300;
}
class Comment { }
//调用当前空间的常量、函数和类
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();
//调用Article空间的常量、函数和类
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();
?>
然后我的确得到了Article空间的元素数据。
子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。
举个栗子:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法,但是同时引入各自的Comment类显然是不行的,代码会出错,在另一个地方重写任何一个Comment也会降低维护性。那这时只能重构类名,我约定了一个命名规则,在类名前面加上模块名,像这样:Article_Comment、MessageBoard_Comment
可以看到,名字变得很长,那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且,以后如果要对各个模块增加更多的一些整合功能,或者是互相调用,发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题,并规定命名规则就能很好的避免这个问题。另一个解决方法可以考虑使用命名空间。
基础
命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。
创建一个命名空间需要使用namespace关键字,这样:
复制代码代码如下:
<?php
//创建一个名为'Article'的命名空间
namespace Article;
?>
要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:
复制代码代码如下:
//例一
//在脚本前面写了一些逻辑代码
<?php
$path = "/";
class Comment { }
namespace Article;
?>
//例二
//在脚本前面输出了一些字符
<html></html>
<?php
namespace Article;
?>
为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。
下面我创建了两个命名空间,顺便为这两个空间各自添加了一个Comment类元素:
复制代码代码如下:
<?php
//创建一个名为'Article'的命名空间
namespace Article;
//此Comment属于Article空间的元素
class Comment { }
//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;
//此Comment属于MessageBoard空间的元素
class Comment { }
?>
在不同空间之间不可以直接调用其它元素,需要使用命名空间的语法:
复制代码代码如下:
<?php
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();
//调用Article空间的Comment类
$article_comment = new \Article\Comment();
?>
可以看到,在MessageBoard空间中调用article空间里的Comment类时,使用了一种像文件路径的语法: \空间名\元素名
除了类之外,对函数和常量的用法是一样的,下面我为两个空间创建了新的元素,并在MessageBoard空间中输出了它们的值。
复制代码代码如下:
<?php
namespace Article;
const PATH = '/article';
function getCommentTotal() {
return 100;
}
class Comment { }
namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
return 300;
}
class Comment { }
//调用当前空间的常量、函数和类
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();
//调用Article空间的常量、函数和类
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();
?>
然后我的确得到了Article空间的元素数据。
子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。
佚名
2024-11-15 14:58:12
类似问题(10)
-
佚名2024-11-15 02:12:21
问求唯美的QQ空间 情侣空间应用 的小屋 名字
答你若安好便是晴天
-
佚名2024-11-15 08:00:13
问EVE 空间站命名.
答首先,你第一次改,输的名字重复或者太长,然后,5分钟可以更改一次对空间站的操作
-
佚名2024-11-15 03:39:40
问PHP的空间可以用ASP的源代码吗?
答玉珍 智轩 雪旋
-
佚名2024-11-15 05:32:39
问两个php文件 使用用一个命名空间 能不能调用另一个文件函数
答可以啊,包含文件 include(), include_once(), require()和require_once()。
-
佚名2024-11-15 07:35:38
问PHP 命名空间无法定义,直接放在
答虽然任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。 命名空间通过关键字namespace 来...
-
佚名2024-11-15 21:45:29
问而作为商业综合体空间最核心的中庭空间用英文怎么说
答而作为商业综合体空间最核心的中庭空间As the core space of the commercial complex, the atrium space
-
佚名2024-11-15 04:35:13
问我下载的php源码,上传到空间,空间提示支持php格式的,网站打不开为什么??大家帮忙解答一下!!
答那得看你下载的是不是完整的啊,有很多免费的是不完全的,还有你是安装版的么,带有数据库没,服务器php版本对不对,还是不会的话再直接找俺解决
-
佚名2024-11-15 08:00:00
问qq情侣空间情侣树怎么使用补签卡
答打开情侣空间的爱情树后,你可以看见上方有一个√的图标,点开这个,里面就能用补签卡,只能补签7天之内的,补签卡下载情侣空间app就送一张
-
佚名2024-11-15 08:00:00
问为什么shift 不能对空格使用
答有两种情况,第一种是你装了新的输入法。是那输入法搞的鬼/只好放弃它。删了。第二种是,键设置没设好。右键点输入法,设置-键设置--双击在不同的输入语言之间切换。把...
-
佚名2024-11-15 08:00:00
问PHP上传重命名文件,怎么能以时间重命名,
答$fileArr = explode('.',$file_name);$file_name = md5(uniqid(microtime())).'.'.$fi...
风水
起名
网名
- 1 男生带海字网名
- 2 类似暴走小萝莉的网名
- 3 唯美韩版网名带翻译
- 4 古风带白网名
- 5 网名带染
- 6 微信怎么昵称为空白
- 7 征途手游召唤昵称大全
- 8 爱课程网怎样改昵称
- 9 经典微信昵称 四个字
- 10 两个字好听的男生昵称带符号的
说说
- 1 三姐妹超拽个性签名
- 2 QQ我的签名不要在空间显示
- 3 见钱眼开的说说
- 4 没有办法的说说
- 5 明天出成绩说说
- 6 适合旅游发表的说说
- 7 假如没有你说说
- 8 给忘记了句子说说心情
- 9 老总的母亲去世如何发说说
- 10 以后要保护自己说说