浅析php命名空间
介绍
印象中只有java代码才会用到一大堆的import,当初看到后一脸懵逼并对php心生自豪:还是我大php牛逼够简洁,殊不知php也有命名空间这一说,这些年用的越来越多。那么,为什么要搞那么麻烦呢?得写一大堆的use(神烦。。。一脸无奈),php手册给出了标准答案:
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
好吧,换成二狗能理解的说法那就是:
- 解决命名冲突
- 重命名
举个栗子
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命名空间的更多相关文章
- JavaScript之命名空间模式 浅析
来源于:http://www.cnblogs.com/syfwhu/p/4885628.html 前言 命名空间可以被认为是唯一标识符下代码的逻辑分组.为什么会出现命名空间这一概念呢?因为可用的单词数 ...
- Xml命名空间浅析
XML实例 在介绍xml命名空间之前,我们先来看段xml代码: <?xml version="1.0" encoding="UTF-8"?> < ...
- [转] Spring4.3.x 浅析xml配置的解析过程(6)——解析context命名空间之property-placeholder和property-override标签
在上一篇解析自定义命名空间的标签中,我们已经知道解析自定义命名空间的标签需要用到NamespaceHandler接口的实现类,并且知道spring是如何获取命名空间对应的命名空间处理器对象的.因此我们 ...
- 浅析PHP类的自动加载和命名空间
php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- netty5 HTTP协议栈浅析与实践
一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...
- C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...
- Android开发之Theme、Style探索及源码浅析
1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...
- WPF学习01:初始XAML浅析
本文内容: 浅析WPF应用默认创建的XAML中元素.attributes. 新建WPF工程“HelloWPF”. 初始创建的主窗体XAML代码如下: <Window x:Class=" ...
随机推荐
- 原生JS实现淘宝无缝轮播
<!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...
- coursera_poj_魔兽世界终结版
五个下午的时间!!!!终于过了!!有史以来做的最复杂的一个题这是我迄今为止做的最复杂也最具有挑战的一个oj作业.虽然之前做过比这个规模一些作业项目,但是往往有简单的模块框架,模块之前的关系也只是有些简 ...
- ubuntu下codeblocks安装与中文化
什么是Code::Blocks Code::Blocks是一个免费.开源.跨平台的集成开发环境,使用C++开发,并且使用wxWidgets做为GUI库.Code::Blocks使用了插件架构,其功能可 ...
- Android 圆角的效果实现
Android 自定义ImageView实现圆角图片昨天给学生布置作业,写微信首页,也就是聊天的界面,listView里的item中联系人的头像是圆角的,图形界面如下: 那么我就仔细研究了圆角的具体实 ...
- Java.MyEclipse Web项目导入Eclipse
Java项目, 在MyEclipse中开发保存的目录结构和配置, 是不能直接在Eclipse中导入和运行的; 有时我们会碰到想把MyEclipse项目导入到Eclipse中开发的需求, 记录过程如下: ...
- 多服务器终端交互利器--polysh和atnodes到高逼格日志中心
最近博客更新的少了,相对而言,我在自己的个人公众号里还是挺活跃的,大家可以扫描旁边的二维码,或者微信搜索公众号:“编程一生”加关注. 在分布式的年代,一个应用需要部署到多台服务器上.那么要查看日志文件 ...
- Swift 之Protocol在cocoa中的使用范例搜集(一)
protocol Reusable: class { static var reuseIndentifier: String {get} static var nib: UINib? {get} } ...
- ES6 for-of循环和迭代器使用细节
SE5之前我们可以用for循环来遍历数组,SE5为数组引进了新的方法forEach(),方便了很多,但是该方法不能够通过break或者return返回外层函数. arr.forEach(functio ...
- ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
IdentityServer实现以下规范: OpenID Connect OpenID Connect Core 1.0 (spec) OpenID Connect Discovery 1.0 (sp ...
- 初窥图像识别与k-means算法
前段时间做了一个车型识别的小项目,思路是利用k-means算法以及词袋模型来做的. 近年来图像识别的方法非常非常多,这边只记录一下我那个项目的思路,核心思想是k-means算法和词汇树. 很遗憾没有做 ...