介绍

印象中只有java代码才会用到一大堆的import,当初看到后一脸懵逼并对php心生自豪:还是我大php牛逼够简洁,殊不知php也有命名空间这一说,这些年用的越来越多。那么,为什么要搞那么麻烦呢?得写一大堆的use(神烦。。。一脸无奈),php手册给出了标准答案:

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

好吧,换成二狗能理解的说法那就是:

  1. 解决命名冲突
  2. 重命名

举个栗子

namespace my; //定义命名空间

//覆盖php类
class mysqli {
public function query(){
return 1;
}
} //覆盖php函数
function preg_replace_callback() {
return 2;
} //覆盖php常量
const PHP_SAPI = 3; $a = new mysqli();
var_dump($a->query()); $b = preg_replace_callback();
var_dump($b);
var_dump(PHP_SAPI);

可以看到妥妥地返回了1,2,3:

int(1) int(2) int(3)

那么问题来了,现在我要用php的mysqli怎么办?最前面加上\就好了:

$a = new \mysqli;

我们在项目中遇到最多的情况是有两个同名的类库或方法而造成的冲突。假设有A,B两个第三方类库,它们都有Cache类,我要同时使用到他们两个:

├─application
│ ├─A
│ │ ├─Cache.php
│ ├─B
│ │ ├─Cache.php
│ ├─test.php

A/Cache.php:

namespace A;
class Cache{
function set(){
return 'ok';
}
}

B/Cache.php:

namespace B;
class Cache{
function set(){
return 'success';
}
}

test.php:

require 'A/Cache.php';
require 'B/Cache.php'; $cache = new A\Cache();
var_dump($cache->set()); $cache = new B\Cache();
var_dump($cache->set());

返回:

string(2) "ok" string(7) "success"

可以看到只要他两的命名空间不同,那么就可以正确调用到

namespace和__NAMESPACE__

__NAMESPACE__返回当前命名空间字符串,namespace关键字可以用来显式访问当前命名空间或子命名空间中的元素

$classname = __NAMESPACE__.'\mysqli';
$a = new $classname();
var_dump($a->query); $a = new namespace\mysqli();
var_dump($a->query());

use

use关键字就是用来指定使用哪个命名空间的,上面的例子我们没有使用到use是因为我们new的时候指定了路径,这样多麻烦呀,test.php改成使用use:

use A\Cache;
require 'A/Cache.php';
require 'B/Cache.php'; $cache = new Cache(); //new A\Cache
var_dump($cache->set()); $cache = new B\Cache(); //new B\Cache
var_dump($cache->set());

这样每次new Cache就默认是实例化了A\Cache了,又可以早点回去和女票钻被窝了~

use as可以指定别名,当某个类库命名空间很长的时候就可以as一个短名称来偷个懒了,考虑类库代码如下:

namespace Blah\Blah\Blah;
class CacheSomeThingImportingAndVeryDangerous{
function set(){
return 'success';
}
}

天呐,这么长的方法名,整个人都不好了,use as一下,整个世界都安静了:

use Blah\Blah\Blah\CacheSomeThingImportingAndVeryDangerous as Cache;
require 'B/CacheSomeThingImportingAndVeryDangerous.php'; $cache = new Cache();
var_dump($cache->set());

以上!提前祝大家新年快乐!

浅析php命名空间的更多相关文章

  1. JavaScript之命名空间模式 浅析

    来源于:http://www.cnblogs.com/syfwhu/p/4885628.html 前言 命名空间可以被认为是唯一标识符下代码的逻辑分组.为什么会出现命名空间这一概念呢?因为可用的单词数 ...

  2. Xml命名空间浅析

    XML实例 在介绍xml命名空间之前,我们先来看段xml代码: <?xml version="1.0" encoding="UTF-8"?> < ...

  3. [转] Spring4.3.x 浅析xml配置的解析过程(6)——解析context命名空间之property-placeholder和property-override标签

    在上一篇解析自定义命名空间的标签中,我们已经知道解析自定义命名空间的标签需要用到NamespaceHandler接口的实现类,并且知道spring是如何获取命名空间对应的命名空间处理器对象的.因此我们 ...

  4. 浅析PHP类的自动加载和命名空间

    php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...

  5. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  7. C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...

  8. Android开发之Theme、Style探索及源码浅析

    1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...

  9. WPF学习01:初始XAML浅析

    本文内容: 浅析WPF应用默认创建的XAML中元素.attributes. 新建WPF工程“HelloWPF”. 初始创建的主窗体XAML代码如下: <Window x:Class=" ...

随机推荐

  1. 安装debian 9.1后,中文环境下将home目录下文件夹改为对应的英文

    安装了debian 9.1后,中文环境下home目录下文件夹显示的是中文,相当不方便cd命令,改为对应的英文吧,需要用到的软件xdg-user-dirs-gtk #安装需要的软件 sudo apt i ...

  2. Java8之旅(六) -- 使用lambda实现尾递归

    前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类 ...

  3. Maven优雅的添加第三方Jar包

    在利用Maven构建项目的时候会出现某些Jar包无法下载到本地的Repository中,鉴于这种情况比较普遍存在,特归纳以下解决问题办法:以 ojdbc14-10.2.0.4.0.jar为例[其它Ja ...

  4. LINUX 笔记-watch命令

    命令格式:watch[参数][命令] 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 命令参数: -n或--interval  watch缺省每2秒运行一下程序,可以用-n ...

  5. Linux系列教程(五)——Linux链接命令和权限管理命令

    前一篇博客我们讲解了Linux文件和目录处理命令,还是老生常淡,对于新手而言,我们不需要完全记住命令的详细语法,记住该命令能完成什么功能,然后需要的时候去查就好了,用的多了我们就自然记住了.这篇博客我 ...

  6. SE6 不定参数和默认参数详解和使用细节

    在SE5以前我们通常通过arguments类数组对象来引用不定形参,SE6则使用了一种叫做不定参数的写法,比起隐式的arguments要直观的多. 不定参数使用...参数名来指定一个不定参数,参数名指 ...

  7. linux学习(十)find命令、Linux文件后缀名、Linux和windows文件互传

    一.和find相关的几个搜索命令,了解即可. 1.1 which [root@iZ25lzba47vZ ~]# which ls alias ls='ls --color=auto' /usr/bin ...

  8. Problem L

    Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: L&qu ...

  9. Nginx详解以及LNMP的搭建

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  10. Python-数据类型-转摘

    1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4. ...