∥例二
/∥在脚本前面输出了一些字符<?php namespace Article;?>
为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。
下面我创建了两个命名空间,顺便为这两个空间各自添加了一个Comment类元素:复制代码代
码如下:<?php /∥创建一个名为'Article'的命名空间 namespace Article;/∥此Comment属于Article空间的元素 class Comment {) /∥创建一个名为'MessageBoard'的命名空间namespace MessageBoard;/∥此Comment属于 MessageBoard空间的元素class Comment{}?>
在不同空间之间不可以直接调用其它元素,需要使用命名空间的语法:复制代码代码如下:<?p hp namespace Article; class Comment {} namespace MessageBoard;class Comment{}//调用当前空间(MessageBoard)的Comm ent类$comment=new Comment0;//调用Article空间的Comment类 $article comment = new Article\Comment0; ?>
可以看到,在MessageBoard空间中调用article空间里的Comment类时,使用了一种像文件路
径的语法:\空间名\元索名
除了类之外,对函数和常量的用法是一样的,下面我为两个空间创建了新的元素,并在Message
Board空间中输出了它们的值。复制代码代码如下:<?php namespace Article;const PATH='/art icle'; function getCommentTotal0 {return 100;} class Comment {} namespace MessageBoard; const PATH = '/message_board'; function getCommentTotal 0{return 300;}class Comment{}/∥调用当前空间的常量、函数和类echo PATH;/∥/message_b oard echo getCommentTotal0;//300$comment=new Comment0;∥调用Article空间的常 量、 函数和类echo \Article\PATH;///article echo \Article\getCommentTotal0;//100 $article_ comment = new VArticle\Comment0; ?>
然后我的确得到了Article空间的元素数据。子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间
的关系。抱歉我忘了说,article和message board这两个模块其实都是处于同一个blog项目内。如
果用命名空间来表达它们的关系,是这样:复制代码代码如下:<?php //我用这样的命名空间表示处于blog 下的article模块 namespace Blog\Article;class Commen t{ //我用这样的命名空间表示处于blog下的message board模块namespace Blog\MessageBoa rd;class Comment{}//调用当前空间的类 $comment = new CommentO;//调用Blog Article空间的类 $article comment = new \Blog\Article\Comment0; ?>
而且,子空间还可以定义很多层次,比如说Blog\Article\Archives\Date
公共空间
我有一个common_inc.php脚本文件,里面有一些好用的函数和类:复制代码代码如下:<?php function getIP0 {} class FilterXSS {}?>
在一个命名空间里引入这个脚本,脚本里的元素不会归属到这个命名空间。如果这个脚本里没有
定义其它命名空间,它的元素就始终处于公共空间中:复制代码代码如下:<?php namespace Blog\Article;//弓|入脚本文件 include'!./common_inc.php';$filter_XSS=new FilterXSS0;/∥出现致命错误: 找不到Blog\A rticle\FilterXSS类$filter XSS=new\FilterXSSO;//正确?>
调用公共空间的方式是直接在元素名称前加\就可以了,否则PHP解析器会认为我想调用当前空
间下的元素。除了自定义的元素,还包括PHP自带的元素,都属于公共空间。
要提一下,其实公共空间的函数和常量不用加\也可以正常调用(不明白PHP为什么要这样
做),但是为了正确区分元素,还是建议调用函数的时候加上
名称术语
在说别名和导入之前,需要知道关于空间三种名称的术语,以及PHP是怎样解析它们的。官方文
工
档说得非常好,我就直接拿来套了。
1.非限定名称,或不包含前缀的类名称,例如KaTeX parse error: Undefined control sequence: \Article at position 37: …。如果当前命名 空间是Blog\̲A̲r̲t̲i̲c̲l̲e̲,Comment将被解析为Bl…comment=new Article\Comment0;。如果当前的命
名空间是Blog,则Comment会被解析为Blog\Article\Comment。如果使用Comment的代码不包
含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。
3.完全限定名称,或包含了全局前缀操作符的名称,例如KaTeX parse error: Undefined control sequence: \Article at position 12: comment=new\̲A̲r̲t̲i̲c̲l̲e̲\Commen tO;。在这种…blog_comment=new CommentO;//限定名称,表示相对
于Blog空间
//这个调用将被解析成 Blog\Article\CommentO;KaTeX parse error: Undefined control sequence: \Commen at position 30: …t = new Article\̲C̲o̲m̲m̲e̲n̲ ̲t0;∥类前面没有反斜杆\∥完…article_comment =new\Blog\Comment0;/∥类前面有反斜杆/∥完全限定名称,表示绝
对于Blog空间
//这个调用将被解析成 Blog\Article\Comment(O;KaTeX parse error: Undefined control sequence: \Blog at position 23: …_comment = new \̲B̲l̲o̲g̲\Article\Co mme…article_comment = new Article\CommentO;/∥
为命名空间使用别名 use Blog\Article as Arte;//使用别名代替空间名
KaTeX parse error: Undefined control sequence: \Comment at position 27: …ment = new Arte\̲C̲o̲m̲m̲e̲n̲t̲/0;//导入一个类 use …article comment = new
Comment0;//为类使用别名
use Blog\Article\Comment as Comt;∥使用别名代替空间名
KaTeX parse error: Undefined control sequence: \Article at position 112: … namespace Blog\̲A̲r̲t̲i̲c̲l̲e̲; class Comment…article_comment= new Comment/O;/∥与当前空间的Comme
nt发生冲突,程序产生致命错误∥为类使用别名
use Blog\Article\ Comment as Comt;$article_comment = new Comt0;//与当前空间的Co
mt发生冲突,程序产生致命错误?>动态调用
PHP提供了namespace关键字和_NAMESPACE_魔法常量动态的访问元素,NAMESPACE
可以通过组合字符串的形式来动态访问:复制代码代码如下:<?php namespace Blog\Article; const PATH = '/Blog/article'; class Co mment {} //namespace关键字表示当前空间echo namespace\PATH;///Blog/article $comment = ne w namespace\CommentO;//魔法常量_NAMESPACE_的值是当前空间名称 echo __NAMESPAC E_;//Blog\Article //可以组合成字符串并调用 $comment_class_name = __NAMESPACE__. "\Comment'; $comment = new $comment_c lass_name0;?>
字符串形式调用问题
上面的动态调用的例子中,我们看到了字符串形式的动态调用方式,如果要使用这种方式要注意
两个问题。
1.使用双引号的时候特殊字符可能被转义复制代码代码如下:<?php namespace Blog\Article;class name{}//我是想调用Blog\Article\name $class_name =__ NAMESPACE_."\name";/∥但是\n将被转义为换行符 $name = new $class_nameO;//发生致命 错误?> 2.不会认为是限定名称 PHP在编译脚本的时候就确定了元素所在的空间,以及导入的情况。而在解析脚本时字符串形式 调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称。复制代码代码如下:<?php namespace Blog;//导入Common类 use Blog\Article\Common;//我想使用非限定名称调用Blog\Article\Common $common cla ss_name='Common';/∥实际会被当作非限定名称,也就表示当前空间的Common类,但我当前类 没有创建Common类$common=new $common class name0;//发生致命错误:Common类 不存在//我想使用限定名称调用Blog\Article\Common $common class name='Article\Comm on';/∥实际会被当作完全限定名称,也就表示Article空间下的Common类,但我下面只定义了Blog \Article空间而不是Article空间 $common=new $common class name(0;//发生致命错误:Article\Common类不存在 namespace Blog\Article;class Common {}?>总结
我对PHP的命名空间刚刚接触,也不能随便给一些没有实践的建议。我个人认为命名空间的作用
和功能都很强大,如果要写插件或者通用库的时候再也不用担心重名问题。不过如果项目进行到一定
程度,要通过增加命名空间去解决重名问题,我觉得工作量不会比重构名字少。也不得不承认它的语
法会对项目增加一定的复杂度,因此从项目一开始的时候就应该很好的规划它,并制定一个命名规
范。文章来源地址https://www.toymoban.com/news/detail-445954.html
文章来源:https://www.toymoban.com/news/detail-445954.html
到了这里,关于VS解决方案、命名空间和项目的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!