复习PHP-语言参考-命名空间
admin
2023-07-03 12:24:33
0

1.定义命名空间

命名空间只作用于类,函数,常量。(注意只能是const的常量,而不能是define出来的常量,我测试是报错的。)

通过namespace 声明。

必须在所有代码之前声明。

2.定义子命名空间

可以多用层,这样可以理出一个层级结构来,比如LIBRARY里有几个不同类型的库,有层次才显得更清晰。(ACTION\INDEX)

3.在同一文件定义多个命名空间

用大括号括起来,但不推荐

如:

namespace a{func1,class2,const3}

namespace b{xxx}

?>

多个命名空间和执行代码放在一起需要这么干

namespace a{func1,class2,const3}

namespace b{xxx}

namespace{

\a\func1();

}

?>

4.使用基础

注意:命名空间的使用有点类似于HTML里URL的规则

namespace a\a1;

function d(){}

d(); //a\a1\d()

\a\a1\d(); //\a\a1\d();

一个相对路径,一个绝对路径。

?>

注意:如果你想在一个命名空间内访问全局变量或全局方法或全局类,可以加上\

namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // 调用全局函数strlen
$b = \INI_ALL; // 访问全局常量 INI_ALL
$c = new \Exception('error'); // 实例化全局类 Exception
?>

提示:如果要实例化一个字符串形式的类名(包含命名空间),那就最好用单引号将字符串引起来。如 $a = new ‘\namespace\classname’;

5.namespace关键字和__NAMESPACE__常量

__NAMESPACE__在全局是一个空字符串
__NAMESPACE__在动态创建变量时非常有用。
比如
namespace abc;
function get($classname)
{
     return new __NAMESPACE__.'\\'.$classname;
}
?>
__NAMESPACE__在类里也可以用这样动态创建变量什么的,有点类似于self的功能
而namespace 可以当作当前命名空间名称来动态使用,如:
namespace A;
const name = 'jason';
echo namespace\name; // print out jason;
?>
如果在全局中使用的话
$a = new namespace\c; //这里实际上只有c; 而会忽略namespace 因为它是空的。
?>


6.别名和use的使用
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use \ArrayObject;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
?>
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?>
注意:别名不能用变量来代替,如:
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?>


7.全局空间
如果在没有命名空间的脚本里写东西,默认就是全局的,如果非要加个特征码或在命名空间调用全局空间里的类,常量和函数的话,前面加个\即可。
8.使用命名空间时,优先级
namespace A\B\C;
class Exception extends \Exception {} //完全限定全局类\Exception
?>
注意:在命名空间里,用全局和本身的函数 类和常量时,需要特别小心它是属于哪里的,是全局的还是该命名空间里的,所以:
在命名空间作用域里,用全局的类 常量和函数时,都最好要加上完全限定名称的符号\   如\fopen,\substr  总觉得怪怪的啊。
注意:在一个已有命名空间的脚本里,直接输写无命名空间符号的函数或者常量或者类,它的查找顺序为:
1、先在本命名空间中找该函数,常量或类
2、找不到的时候再在全局里找。
namespace A;
use B\D, C\E as F;

// 函数调用

foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
            // 再尝试调用全局函数 "foo"

\foo();     // 调用全局空间函数 "foo"

my\foo();   // 调用定义在命名空间"A\my"中函数 "foo"

F();        // 首先尝试调用定义在命名空间"A"中的函数 "F"
            // 再尝试调用全局函数 "F"

// 类引用

new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
            // 如果未找到,则尝试自动装载类 "A\B"

new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
            // 如果未找到,则尝试自动装载类 "B\D"

new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
            // 如果未找到,则尝试自动装载类 "C\E"

new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
            // 如果未发现,则尝试自动装载类 "B"

new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
            // 如果未发现,则尝试自动装载类 "D"

new \F();   // 创建定义在全局空间中的类 "F" 的一个对象
            // 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

B\foo();    // 调用命名空间 "A\B" 中函数 "foo"

B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"

D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"

\B\foo();   // 调用命名空间 "B" 中的函数 "foo"

\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
            // 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"

\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

相关内容

热门资讯

深度推荐:2026年五大精选手... 本文全面梳理2026年手机电池批发市场主流品牌,聚焦续航升级与库存优化两大核心需求。通过对五大头部品...
法国外长要求安理会就以色列在黎... △法国外长巴罗(资料图)当地时间5月31日,法国外长巴罗宣布,他已要求召开一次联合国安全理事会紧急会...
大数据赋能矿山安全 科技先锋刘... 在煤炭产业高质量发展与智慧矿山建设加速推进的背景下,矿山安全监管正从传统人工巡查向数字化、智能化、预...
解压玩具“娜塔莎”引争议,它的... 最近,一款名为“娜塔莎”的婴儿造型“捏捏乐”解压玩具在网络上和校园里悄然流行,商家宣称其可以用来缓解...
坚持“四个面向” 矢志科技报国... 5月30日,第十个全国科技工作者日如期而至。日前,中央宣传部、中国科协向全社会发布“最美科技工作者”...
显微镜的“能源革命” ——无液... 我国自主研制闭循环光耦合SPM系统,为量子科技前沿研究提供可持续的“中国方案”。 导读 Part ...
五部门开展“百场万企”大中小企... 记者从工业和信息化部获悉,工业和信息化部、国家发展改革委、国务院国资委等五部门联合印发通知,组织开展...
22年,一个免费软件的域名之战 奇怪的是,从 2004 年推出以来,Paint.NET一直托管在 getpaint.net网站上,无...
柬埔寨一名中国地产商人被残忍杀... 柬埔寨首都金边一名中国男子,疑遭人绑架、勒索并残忍杀害。其尸体于5月30日上午,在金边市朗哥区一处空...
2.5次元CNC加工厂家梳理 ... 导语:在精密制造领域,2.5次元CNC加工凭借其高精度检测与复杂零件加工能力,成为新能源汽车充电接口...