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 '山东';
}
?>注意事项:
命名空间只对类、函数、常量起作用
声明命名空间的当前脚本第一个命名空间前面不能有任何代码(注释除外)
命名空间是虚拟的抽象空间,不是真的存在目录
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号