文档章节

PHP 命名空间小结

渺小的尘埃
 渺小的尘埃
发布于 2014/06/07 22:24
字数 1257
阅读 64
收藏 1
点赞 0
评论 0

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

###基础###

<!--lang:php-->
//  创建一个名为Article的命名空间
<?php
namespace Article;

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

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

<!--lang:php-->
<?php
namespace Article;
Class Comment {}

namespace MessageBoard;
Class Comment {}

$comment = new Comment(); // 如果什么都不写,这是默认调用当前空间(MessageBoard)的Comment类

// 下面是调用Article 类的Comment类
$comment = new \Article\Comment();

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

<!--lang:php-->
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/dir
echo \Article\getComment(); // 100
$comment = new \Article\Comment();    

###子命名空间###

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

<!--lang:php-->
namespace Blog\Article;
Class Comment {}

namespace Blog\Messageboard;
Class Comment {}

// 调用当前空间的类
$comment = new Comment();

// 调用 Blog\Article 空间的类
$comment = new \Blog\Article\Comment();

###公共空间###

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

<!--lang:php-->
<?php
function getIP() {}
Class FilterXSS {}

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

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

<!--lang: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 {}

© 著作权归作者所有

共有 人打赏支持
渺小的尘埃
粉丝 3
博文 30
码字总数 16498
作品 0
海淀
程序员
PHP之命名空间

从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。这个原理应...

jjjssswww
2017/06/06
0
0
php--------命名空间

从php 5.3 版本后,加入了命名空间的定义,在PHP中命名空间的作用就是防止类的重复。就相当于windows的一个文件夹中不能有两个相同名字的文件,所以继续增加两个文件夹把文件放进去,防止文件...

切切歆语
02/22
0
0
PHP的命名空间

PHP的命名空间(namespace)是php5.3之后才有的。这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的。 为什么php中要使用namespace? 假设如果不使用namespace,那么每...

王二狗子11
01/07
0
0
PHP之新手自学基础知识(六)——拓展篇之命名空间

命名空间概述 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮...

天谴残魂
01/09
0
0
php 之命名空间

定义: 命名空间是一种封装事物的方法。 作用:一般用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: (1) 用户编写的代码与PHP内部的类/函数/常量或第三方类/...

Erik8928
2017/10/20
0
0
PHP命名空间及自动加载

PHP命名空间及自动加载 Run - 学习练习复习2016-02-2958 阅读 PHP 什么是命名空间呢? 命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,...

Run - 学习练习复习
2016/02/29
0
0
复习PHP-语言参考-命名空间

1.定义命名空间 命名空间只作用于类,函数,常量。(注意只能是const的常量,而不能是define出来的常量,我测试是报错的。) 通过namespace 声明。 必须在所有代码之前声明。 2.定义子命名空...

qzd1989
2014/05/02
0
0
PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性 命名空间 延迟静态绑定 lambda匿名函数 命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MV...

big_cat
2016/02/02
5.4K
0
PHP命名空间(Namespace)的使用详解

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结。 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错...

Surjur
2015/02/12
0
0
PHP编码规范(PSR-4)-Autoloader 自动加载

PSR-4 Autoloader 1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类...

2688
2016/07/04
57
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

回想过往,分析当下,着眼未来

好久没有真正的在纸质笔记本上写过东西了,感觉都快不会写字了,笔画都不知道怎么写了。接下来就说说咱们的正事。 2018年7月22日,我做了一个决定,那就是去参加安全培训(可能是我职业生涯中...

yeahlife
42分钟前
4
0
关于工作中的人际交往

关于工作中的人际交往 Intro 写了篇发泄情绪的博客,但不会发布出来。 大概就是,要么忍,要么滚。 以及一些不那么符合社会主义核心价值观,不满于大资本家与小资本家剥削的废话。

uniqptr
47分钟前
0
0
springMVC的流程

1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(...

JavaSon712
今天
0
0
大数据教程(3.2):Linux系统软件安装之自动化脚本

博主前面文章有介绍过软件的安装,可以帮助IT人员顺利的完成功能软件安装;但是,对于我们运维人员或者需要管理软件安装的项目经理来说,有些应用一次行需要搭建很多台相同的软件环境(如tom...

em_aaron
今天
0
1
Spring Boot 2.0.3 JDBC整合Oracle 12

整合步骤 1. Oracle驱动引入 Oracle驱动一般不能通过maven仓库直接下载得到,需自行下载并导入到项目的lib目录下,建议通过如下pom依赖引入下载的Oracle驱动 <!-- Oracle 驱动 -->...

OSC_fly
今天
0
0
java 8 并行流 - 1

下面创建一个并行流,与顺序流 //顺序流Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .reduce(0L, Long::sum);//并行流Stream.iterate(0L, i -> i......

Canaan_
今天
0
0
数据结构与算法5

二分法采用向下取整的方法 使用有序数组的好处是查找的速度比无序数组快的多,不好的方面是因为要将所有靠后的数据移开,所以速度较慢,有序数组和无序数组的删除操作都很慢。 有序数组在查找...

沉迷于编程的小菜菜
昨天
1
1
SpringBoot | 第十一章:Redis的集成和简单使用

前言 上几节讲了利用Mybatis-Plus这个第三方的ORM框架进行数据库访问,在实际工作中,在存储一些非结构化或者缓存一些临时数据及热点数据时,一般上都会用上mongodb和redis进行这方面的需求。...

oKong
昨天
5
0
对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
昨天
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部