PHP命名空间

1、概述

命名空间是PHP为了解决重名问题推出的机制,密码空间可以认为地将内存进行分隔,让不同内存区域的同名结构得以共存,类似操作系统中文件夹的概念

基础语法:namespace space_name;

一个文件中可以声明多个命名空间,但实际开发往往只会定义一个,第一次声明的命名空间必须在所有代码之前

2、命名空间子空间

类似子文件夹的概念,可以在一个命名空间下面创建一个子空间:namespace space\son_space1;

同时子空间下还可以创建下一级子空间:namespace space\son_space1\son_space2;

3、全局空间

所有定义的命名空间的顶级空间,所有未定义命名空间的脚本都位于全局空间中

所有空间本质上都是在全局空间中划分出来的

所有系统常量、系统函数、系统类都属于全局空间下的

在命名空间中,使用非限定名称方式访问空间成员时,首先会在当前空间内查找,如果找不到,会去全局空间查找该成员是否是系统常量或系统函数,不会查找系统类。

4、空间元素访问

4.1、非限定名称访问:直接访问当前空间内成员

4.2、限定名称访问:用于访问当前空间子空间的成员,在元素前使用空间名字+\来访问

4.3、完全限定名称访问:从全局空间(相当于根目录,用\表示)开始写路径,相当于绝对路径

后两种访问方式只能访问空间中的常量,函数和类

 

<?php

//第一个声明的命名空间之前不能有其他代码 
namespace p2;
function a(){
    echo $a.'p2<br>';
}

namespace p1\s1;
class A{
    function __construct(){
        echo 's1<br>';
    }
}


namespace p2\s2;
const A = 's2';

namespace p1;
function a(){
    echo 'p1<br>';
}

//非限定名称访问
a();            //p1
//限定名称访问
new s1\A();        //s1
//完全限定名称访问
echo \p2\s2\A;    //s2

//非限定名称访问系统常量
echo __FILE__.'<br>';
//非限定名称访问系统函数
echo time().'<br>';
//非限定名称访问系统类
//new mysqli();      //报错
new \mysqli();        //必须使用完全限定名称访问

5、命名空间引入

为了减少复杂的完全限定名称访问,可以将其他空间的成员(类、函数、常量)引入到当前空间,从而直接使用非限定名称访问

引入方式,使用use关键字:

namespace s1;
class Man{}
function f(){}
const PI = 3.14;

namespace s2;

//引入类
//use s1\Man;
new Man();
//引入函数
//use function s1\f;
f();
//引入常量
//use const s1\PI;
echo PI;

//一次性引入
// use s1\{
//     Man,
//     function f,
//     const PI
// };

注意:使用use进行空间引入时,默认从全局空间开始构建路径,即不以\符号开头的路径会在路径开头自动加上\符号,以上代码 use s1\Man;等价于use \s1\Man;

重名问题:

如果存在重名,则在use语句后面加上as 别名:use s1\Man as alias;

namespace s1;
class Man{}
const PI = 3.14;
namespace s2;
class Man{}
const PI = 3.14159;
use s1\{
    Man as M,
    const PI as PI1
};
new M();

引入空间: use spacename; 引入的空间可看作当前空间的子空间

namespace s1;
class Man{}
function f(){}
const PI = 3.14;
namespace s2;
use s1;
new s1\Man();
s1\f();
echo s1\PI;

 

posted @ 2019-02-15 20:00  chuanzi  阅读(253)  评论(0编辑  收藏  举报