Blogger Information
Blog 17
fans 0
comment 0
visits 11718
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
命名空间
指纹指恋的博客
Original
718 people have browsed it

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 '山东';
}

?>

注意事项:

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

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

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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post