PHP浅析php命名空间

介绍

记忆中唯有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';
    }
}

PHP 1

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

use Blah\Blah\Blah\CacheSomeThingImportingAndVeryDangerous as Cache;
require 'B/CacheSomeThingImportingAndVeryDangerous.php';

$cache = new Cache();
var_dump($cache->set());

PHP 2

PHP,上述!提前祝我们新年快乐!

 

相关文章