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

以上!提早祝你們新年快樂!

相關文章
相關標籤/搜索