博客列表 >命名空间

命名空间

指纹指恋的博客
指纹指恋的博客原创
2018年03月21日 14:31:18719浏览

PHP中命名空间的由来

命名空间是PHP5.3以后才有的,这个概念在C#中很早就有了,PHP中的命名空间概念其实和C#中的是一样的。

什么是命名空间

从广义上来说,命名空间是一种封装事物的方法,在很多地方都可以见到这种概念,例如:在操作系统中,目录用来将文件分组,对于目录中的文件来说,它就扮演了命名空间的角色;

举个例子:文件foo.txt可以同时存在 /home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个foo.txt文件,另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分割符放在文件名之前得到 /home/greg/foo.txt 。这个原理应用到程序设计领域就是明明空间的概念。

命名空间元素访问方式:

  • 非限定名称:

  • 限定名称

  • 完全限定名称

<?php
namespace henan;
function cesi(){
 echo '河南';
}

namespace shandong;
function cesi(){
 echo '山东';
}

cesi();            //非限定名称,直接访问命名空间shandong下的cesi(),输出山东
henan\cesi();      //限定名称,尝试访问命名空间shandong\henan下的cesi(),由于不存该命名空间,会报错。
\henan\cesi();     //完全限定名称,直接访问命名空间hean下的cesi(),输出河南

?>

命名空间的引入

<?php
namespace zhongguo\henan;
function cesi(){
 echo '河南';
}

namespace meiguo\niuyue;
function cesi(){
    echo '纽约';
}
class People{
    static $name = 'Peter';
}

namespace zhongguo\shandong;
function cesi(){
 echo '山东';
}
class People{
    static $name = '山西人';
}

use meiguo\niuyue;
\meiguo\niuyue\cesi();    //输出 纽约
niuyue\cesi();            //输出 纽约
echo \meiguo\niuyue\People::$name;    //输出 Peter

use meiguo\niuyue\People;
echo People::$name;    //由于山西中也存在People类,且其中也包含静态属性$name,这是就会发生冲突,系统就会报错。

//解决方案
use meiguo\niuyue\People as Pe;
echo Pe::$name;    //系统输出Peter;

//以下这种访问方式会访问到山西的People类中的属性
use meiguo\niuyue;
echo People::$name;    //输出 山西人
?>

引入文件没有命名空间,访问外部文件里的函数或方法

common.php

<?php
function cesi(){
    echo '台湾';
}
class People{
    static $name = '台湾人';
}

?>

运行文件test.php

<?php
namespace zhongguo\henan;
function cesi(){
 echo '河南';
}

include("./common.php");

namespace zhongguo\shandong;
function cesi(){
 echo '山东';
}
class People{
    static $name = '山东人';
}

\cesi();    //会访问外部引入的公共命名空间,输出 台湾
echo \People::$name;    //会访问外部引入的公共命名空间,输出 台湾人
?>

运行文件没有命名空间,引入外部文件里包含命名空间

test.php

<?php
function cesi(){
    echo '台湾';
}

include("./common.php");

class People{
    static $name = '台湾人';
}

zhongguo\henan\cesi();    //访问外部引入文件的zhongguo\henan命名空间下的cesi(),输出 河南
\zhongguo\henan\cesi();    //这种方式也可以访问外部引入文件的zhongguo\henan命名空间下的cesi(),输出 河南
?>

common.php

<?php
namespace zhongguo\henan;
function cesi(){
 echo '河南';
}

namespace zhongguo\shandong;
function cesi(){
 echo '山东';
}

?>

注意事项:

  • 命名空间只对类、函数、常量起作用

  • 声明命名空间的当前脚本第一个命名空间前面不能有任何代码(注释除外)

  • 命名空间是虚拟的抽象空间,不是真的存在目录

上一条:php0320作业下一条:3月20日作业
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议