博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 命名空间小结
阅读量:7274 次
发布时间:2019-06-29

本文共 2594 字,大约阅读时间需要 8 分钟。

hot3.png

命名空间主要目的就是解决重名问题,由于在PHP里,函数重载是不允许的,所以在这种情况下要避免重名,最常见的做法就是约定好命名,比如用前缀,使用当前文件路径。但是这种做法就使代码量增多了。当项目逐渐变大的时候,如果规划不好还是有可能出现重名的错误。所以这时候命名空间是一个很好的解决办法

###基础###

// 创建一个名为Article的命名空间

*注意的是在脚本里首次出现的命名空间前面不能出现任何代码,连空格都不行,否则会报错

为什么说首次出现呢?因为在同一个脚本里可以使用多个命名空间,他们不能直接简单的调用,需要使用命名空间的语法:

可以看到在调用Article空间里的Comment类的时候使用了类似文件路径的语法: 空间名\元素名 除了类以外,函数和常量的用法也是一样的:

namespace Article;const PATH = '/abc/dir';function getComment() { return 100;}Class Comment {}namespace MessageBoard;const PATH = '/messageboard';function getComment() { return 300;}Class Comment{}// 调用当前空间(MessageBoard)的常量,函数和类echo PATH; // messageboard;echo getComment(); // 300$comment = new Comment();// 调用Article 空间的常量,函数和类echo \Article\PATH; // /abc/direcho \Article\getComment(); // 100$comment = new \Article\Comment();

###子命名空间###

命名空间可以有自己的子空间,例如Blog\Article ,在博客空间内有个文章空间。空间可以有很多的层次。 比如上面的Article 都属于Blog 空间的。

namespace Blog\Article;Class Comment {}namespace Blog\Messageboard;Class Comment {}// 调用当前空间的类$comment = new Comment();// 调用 Blog\Article 空间的类$comment = new \Blog\Article\Comment();

###公共空间###

先举个这样的一个例子,这里有一个要被包含的脚本(common_inc.php),并且脚本里没有声明命名空间:

然后在另一个含有命名空间的脚本里包含这个文件时,其实这里的类和函数不属于当前空间的:

namespace Blog\Article;include './common_inc.php';$filter_xss = new FilterXSS(); // 这样会报错: 找不到 Blog\Article\FilterXSS类$filter_xss = new \FilterXSS(); // 这是正确写法

调用公共空间的属性 只需要在前面加一个 \ 就行了,否则PHP 会解析成当前命名空间下的东西,除了自定义的元素,PHP自带的元素都属于公共空间

###名称术语###

在说空间导入之前,先说几个术语概念,方便今后统一说明:

  1. 非限定名称 (不包含前缀的类名称) $comment = new Comment() 这种的。如果当前命名空间是Blog\Article 则其实解析成 Blog\Article\Comment
  2. 限定名称(不包含前缀的类名称) $comment = new Article\Comment 这种的。如果当前命名空间是 Blog 则其实解析成 Blog\Article\Comment
  3. 完全限定名称(包含了全局前缀的类名称) $comment = new \Artilce\Comment 这种的。 这种情况下 总是被解析成 Article\Comment

把他们想像成文件路径更好理解: 非限定名称: comment.php 限定名称: /article/comment.php 完全限定名称: /blog/article/comment.php

###别名和导入###

别名和导入可以当作一种调用命名空间的快捷方式。PHP 不支持导入函数和常量

别名可以用as 关键字来设定: <!--lang:php--> use Blog\Article as Article; use Blog\Article // 效果同上 等于 use Blog\Article as Article; $article = new Article\Comment();

###字符串调用问题###

  1. 使用双引号注意特殊字符转义问题

    <!--lang:php-->

    namespace Blog\Article; Class name {} $class_name = NAMESPACE."\name"; // 但是\n 将被转义成换行符

  2. 字符串形式调用永远不会认为是限定名称

PHP 在编译脚本的时候就已经确认了元素所在的命名空间,以及导入的情况。而在解析脚本时,字符串的形式调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称

namespace Blog;use Blog\Article\Common;$common = new Article\Common(); // 限定名称, 解析为 Blog\Article\Common$namespace = 'Article';$common = new $namespace.'\\'.Common(); // 使用字符串的话 就解析成了 完全限定名称, Article\Common.然而没有这个命名空间 所以报错namespace Blog\Article;Class Common {}

转载于:https://my.oschina.net/guanyue/blog/276634

你可能感兴趣的文章
ThinkPHP学习 volist标签高级应用之多重嵌套循环、隔行变色(转)
查看>>
安全测试的目的,发现哪些问题
查看>>
WinForm DataGridview.AutoSizeColumnsMode属性
查看>>
linux下 html转pdf
查看>>
架构,改善程序复用性的设计~第三讲 实现一种功能的代码只能出现在一处(续)...
查看>>
ViewPager的使用
查看>>
Windows下编译Python2.7源码
查看>>
监督学习中的“生成模型”和“判别模型”
查看>>
如何编写出拥抱变化的代码
查看>>
Debug查看Struts2中ExceptionMappingInterceptor拦截器怎么把ExceptionHolder放入值栈中,以及理解拦截器的工作原理。。。...
查看>>
Linux top命令
查看>>
(三)Redis之数据结构概念以及数据结构之字符串
查看>>
BZOJ 1006 [HNOI2008]神奇的国度
查看>>
IOS 推送-客户端处理推送消息
查看>>
vue-router懒加载
查看>>
更改计算机名,VS无法连接TFS
查看>>
一个非长好用的在线编辑器
查看>>
Yii2配置Nginx伪静态的方法
查看>>
java集合类(六)About Queue
查看>>
hh:mm:ss时间格式那些事儿
查看>>