博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析php命名空间
阅读量:5229 次
发布时间:2019-06-14

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

介绍

印象中只有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\Cachevar_dump($cache->set());$cache = new B\Cache(); //new B\Cachevar_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());

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

 

转载于:https://www.cnblogs.com/justlikeheaven/p/7943438.html

你可能感兴趣的文章
JQ实现图片上传预览功能
查看>>
Android--样式经验
查看>>
php实现二叉树的遍历
查看>>
iOS - UIStepper
查看>>
[ZJOI2008]骑士
查看>>
C++学习笔记:Socket tcp
查看>>
Windows Server 2012 R2 或 2016 无法安装 .Net 3.5.1
查看>>
单例模式
查看>>
Myeclipse10破解版安装包
查看>>
【搜索】hdu4457 Klotski_2012杭州赛区E题
查看>>
iOS发展 ---- 至iPhone 6自适应布局设计 Auto Layout
查看>>
很多Python新手教程
查看>>
thinkphp 访问其它控制器模板
查看>>
RESTful API 设计指南
查看>>
windows通过Visual Studio Code中配置GO开发环境(转)
查看>>
原生HttpClient详细使用示例
查看>>
题解报告:hdu 6441 Find Integer(费马大定理+智慧数)
查看>>
jquery插件datepicker
查看>>
使用Adapter实现listview绑定数据,getView()方法未执行原因
查看>>
event.srcElement与event.target的区别
查看>>