PHP名称空间(名称空间)的使用

对于名称空间,官方文档已经详细描述了{ },我在这里做了一些实践和总结。

名称空间最清晰的目的之一是解决相同的问题,PHP不允许两个函数或类具有相同的名称,否则会产生致命错误。

例如:工程项目中存在两个模块:文章和留言板,每一类注释,处理用户的信息。然后我想添加一些信息统计到所有的用户,例如,我想得到所有的信息。它是调用提供的评论这一次的方法的一个很好的实践,但同时,他们自己的评论类的介绍显然是不可接受的,代码也会犯错误,而在另一个地方重写任何评论也将减少维护。当时,只有类的名字被重建,我同意命名规则与模块名字在类的名称,前面是这样的:article_comment,messageboard_comment

你可以看到,这个名字变得很长,这意味着更多的代码将被写(至少多个字符)在评论以后使用,以后如果你想添加更多的一些模块的集成功能,或打电话给对方,当相同的名称需要重建。当然,这个问题值得注意的是在项目的开始,和命名规则可以避免这一问题的良好途径。另一个办法可以考虑使用命名空间。


注:

在这篇文章中提到的常量:const关键字的PHP5.3开始可以在类的外部使用。Const和定义用于声明常量(差异不指定),但在命名空间的角色定义是全球性的,而const作用于当前空间。等我在指const声明的常量使用。


基础
命名空间将代码分成不同的空间(区域)。每个空间中的常量、函数和类的名称(为了放松,我称它们为下面的元素)不互相影响。这与我们经常提到的封装概念有点类似。

要创建名称空间,需要使用名称空间关键字,以便:
复制代码代码如下所示:
< PHP

/ /创建a'article'namespace
命名空间的文章;

>

需要注意的是,当前脚本文件的第一个名称空间前面没有代码,下面的内容都是错误的:
复制代码代码如下所示:

在脚本前面写一些逻辑代码

< PHP

$路径;

类注释{ }

命名空间的文章;

>



两个案例
在脚本输出字符前面


< PHP

命名空间的文章;

>

为什么要说出第一个名称空间因为可以在同一个脚本文件中创建多个命名空间。

接下来,我创建了两个名称空间,顺便说一下,这两个空间中的每一个都添加了一个注释类元素:
复制代码代码如下所示:
< PHP

/ /创建a'article'namespace
命名空间的文章;

注释属于文章空间元素
类注释{ }


/ /创建a'messageboard'namespace
空间留言板;

评论:留言板 / /空间元素
类注释{ }
>

不同空间之间没有其他元素的直接调用,需要命名空间的语法:
复制代码代码如下所示:
< PHP

命名空间的文章;

类注释{ }


空间留言板;

类注释{ }

电话 / /电流空间(留言板)的评论
注释=新注释();

/称为文章空间注释
article_comment美元=新第评论();

>

你可以看到,当调用评论类文章中的空间里的空间,一个语法像一个文件的路径是:空间名称元素名称

除了类之外,函数和常量的用法是一样的。接下来,我创造新的元素,两个空间,并输出自己的价值观在留言板空间。
复制代码代码如下所示:
< PHP

命名空间的文章;

常量路径;

功能getcommenttotal(){
返回100;
}

类注释{ }


空间留言板;

路径= const的/ message_board;

功能getcommenttotal(){
返回300;
}

类注释{ }

常数、函数和类,称为当前空间
回声路径; / / / message_board
回声getcommenttotal(); / / 300
注释=新注释();

常量、函数和类,称为文章空间。
回声路径;
回声第 getcommenttotal(); / / 100
article_comment美元=新第评论();

>

然后我在文章空间中获得了元素数据。


子空间
名称空间的调用语法与文件路径一样合理,允许我们定制子空间来描述每个空间之间的关系。

对不起,我忘了这两个模块,文章和留言板,实际上是在同一个博客项目。如果一个名称空间是用来表达他们的关系,这是这样的情况:
复制代码代码如下所示:
< PHP

我在blog的一篇文章模块中使用这个名称空间
命名空间博客文章;

类注释{ }


我在博客的留言板模块中使用这个名称空间
命名空间的博客论坛;

类注释{ }

空间调用类型
注释=新注释();

调用blog 文章类空间
article_comment美元=新博客第评论();

>

此外,子空间还可以定义多个级别,如博客


公共空间
我有一些很好的函数和类有一个common_inc.php脚本文件:
复制代码代码如下所示:
< PHP

功能getip(){ }

类filterxss { }

>

脚本是在名称空间中引入的,脚本中的元素不属于名称空间。如果脚本不定义其他命名空间,它的元素总是在公共空间中:
复制代码代码如下所示:
< PHP

命名空间博客文章;

介绍/脚本文件
包括。 / common_inc PHP的;

filter_xss美元=新(filterxss); / /致命错误:找不到博客文章filterxss

filter_xss美元=新( filterxss); / /正确

>

调用公共空间的方法是直接向元素的名称添加,否则PHP解析器会认为我想调用当前空间中的元素,除了自定义元素,包括PHP本身带来的元素,它们都属于公共空间。

事实上,公共空间的功能和常量可以在不添加的情况下调用(也可以正常调用),但是不理解PHP为什么要这样做,但是为了正确区分元素,建议在调用函数时添加函数。


名称术语
在谈到别名和导入之前,您需要知道关于空间的三个名称的术语,以及PHP如何解析它们。

1。不合格,或类名称不包含前缀,如美元=新的评论(评论);如果当前命名空间是博客文章,评论将被解析为博客第 comment.if使用评论代码不在任何命名空间包含的代码(在全球空间),然后评论将被解析为评论。

2。有一个名字,或包括一个前缀的名称,如美元评论=新文章评论();如果当前命名空间的博客,然后评论将被解析为博客第 comment.if使用评论代码不在任何命名空间包含的代码(在全球空间),然后评论将被解析为评论。

三.完全定义的名称,或包含全局前缀运算符的名称,如$ =新注释();在这种情况下,注释总是在代码中解析为单词名(字面名称)文章注释。


事实上,这三个名称可以与文件名(如注释php)、相对路径名(例如,// PHP php)和绝对路径名(例如,博客)进行比较,以便更容易理解。

我用了几个例子来展示它们:
复制代码代码如下所示:
< PHP

创建空间博客
命名空间的博客;

类注释{ }

非限定名称,表示当前的博客空间
此调用将被解析为(blog注释);
blog_comment美元=新的评论();

与博客空间相对应表示的限定名称
此调用将被解析为(博客注释);
article_comment美元=新(第评论 / /班);在没有反对角线前

一个完全限定的名称,绝对在博客空间中
此调用将被解析为(blog注释);
article_comment美元=新(博客评论); / /反对角线课前

一个完全限定的名称,绝对在博客空间中
此调用将被解析为(博客注释);
article_comment美元=新(博客第评论); / /反对角线课前


创建博客子空间文章
命名空间博客文章;

类注释{ }

>

事实上,我一直在使用不合格的名字和完全限定的名字,现在他们终于可以叫出他们的名字了。


别名和进口
别名和进口可以看作一个调用命名空间elements.php快捷不支持导入函数或常量。

它们都是通过使用操作符实现的:
复制代码代码如下所示:
< PHP

命名空间博客文章;

类注释{ }


创建一个BBS空间(我打算打开一个论坛)
命名空间的BBS;

输入一个名称空间
使用博客文章;
导入的命名空间可以使用/限定的名称调用元素。
article_comment美元=新文章评论();

使用名称空间别名
利用博客文章作为艺术;
使用别名而不是空格
article_comment美元=新艺术评论();

进入类中
使用博客 注释;
类可以使用导入非限定名称调用元素。
article_comment美元=新的评论();

使用类的别名
利用博客第评论COMT;
使用别名而不是空格
$article_comment = new Comt ();

>

我注意到在导入元素时,当前空间中的名称元素是什么很显然,这将是一个致命的错误。

例:
复制代码代码如下所示:
< PHP

命名空间博客文章;

类注释{ }


命名空间的BBS;

类注释{ }

类COMT { }


进入类中
使用博客 注释;
article_comment美元=新(评论); / /冲突与当前空间评论程序产生一个致命的错误

使用类的别名
利用博客第评论COMT;
article_comment美元=新(COMT); / /冲突与当前空间COMT程序产生一个致命的错误

>

动态调用
PHP提供了命名空间的关键字和__namespace__幻方常数动态访问元素,而__namespace__可以通过组合字符串的形式动态地访问:
复制代码代码如下所示:
< PHP

命名空间博客文章;

常量路径;

类注释{ }


命名空间关键字表示当前空间。
回声名称空间路径;
注释=新的名称空间注释();

魔法/恒__namespace__值是当前名字空间
回声__namespace__; / /博客第
可以合并成字符串并调用
comment_class_name美元= __namespace__。评论;
评论=新comment_class_name美元(美元);

>

字符串表单调用问题

在上面的动态调用示例中,我们看到字符串形式的动态调用,如果您想使用这种方式,我们应该注意两个问题。

1。当使用双引号时,可以转义特殊字符。
复制代码代码如下所示:
< PHP

命名空间博客文章;

类名{ }

我想调用博客文章她/她/她/
__namespace__。class_name美元= 将没有一个换行符

$name =新($ class_name); / /致命错误

>

2。将不被视为限定名称。

在编译脚本时,PHP决定元素的空间,以及导入的情况。在解析脚本时,String表单调用只能被视为不合格名称和完全限定名,但决不是限定名称。
复制代码代码如下所示:
< PHP

命名空间的博客;

导入
使用博客 ;
我想使用不合格的名称调用博客
common_class_name美元=普通;
实际将被视为不合格名称,也表示普通类的当前空间,但类不创建公共类i。
为常见的=新($ common_class_name); / /致命错误:常见的类不存在

我想使用一个限定名称的调用博客
common_class_name美元= 'article 常见;
实际将被视为完全限定名称,也表示普通类的文章空间,但我只定义博客文章空间,而不是文章空间。
为常见的=新($ common_class_name); / /致命错误:第普通类不存在


命名空间博客文章;

类公共{ }

>

总结
我刚刚接触PHP的命名空间,而我不能给一些建议没有实践。我个人认为命名空间的作用和功能是非常强大的,如果你想写插件或公共图书馆不必担心同样的问题。但如果项目是在一定程度上对通过添加一个命名空间解决同样的问题,我觉得工作量不小于名义重建。我也不得不承认,它的语法会增加项目的复杂性,所以我们应该计划好从一开始的项目,开发命名规范。