浅析php命名空间

介绍

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

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

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

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

  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:sql

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

那么问题来了,如今我要用php的mysqli怎么办?最前面加上\就行了:app

$a = new \mysqli;

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

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

A/Cache.php:spa

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

B/Cache.php:code

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

test.php:blog

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());

以上!提早祝你们新年快乐!

相关文章
相关标签/搜索