php在命名空间外new,PHP命名空间详解

1604944860883_0.jpeg

今天这篇文章的篇幅有点长,小编在这里给你们整理了一下文章的框架,宝宝们可以按照自身的还要选择性的阅读,好啦,话不多说,让我们开始吧!

这篇文章的框架如下:

1604944860883_1.png

命名空间的定义

PHP 命名空间(namespace)是在PHP 5.3中加入的,对于学过C++的宝宝们,那命名空间就不算哪些新事物了。 不过命名空间在PHP当中还是相当重要的。

定义命名空间(使用关键字 namespace)

在下边的例子中我们定义了两个命名空间。

两个命名空间的就会了,相信一个命名空间的状况一定难不倒你们了吧

注意:

以下代码会出现时态错误:

1604944860883_2.jpeg

好啦,命名空间的定义就介绍这么多吧。

访问当前命名空间的内部元素跟方式

PHP支持两种具象的访问当前命名空间内部元素的方式,NAMESPACE 魔术常量跟namespace关键字。

namespace关键字

关键字 namespace 可拿来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。

namespace操作符, 全局代码

NAMESPACE常量

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

命名空间的使用

PHP 命名空间中的类名可以通过三种形式引用:

file1.php 文件代码

file2.php 文件代码

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。

下面在命名空间内部访问全局类、函数跟常量:

使用命名空间: 别名/导入

PHP 命名空间支持 有两种使用俗名或导出方法:为类名称使用俗名,或为命名空间名称使用俗名。

在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有或许的三种导出方法的实例:

导入操作是在编译执行的php命名空间视频,但动态的类名称、函数名称或常量名称则不是。

另外,导入操作只影响非限定名称跟限定名称。完全限定名称因为是确定的,故不受导出的影响。

使用命名空间:后备全局函数/常量

在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解读该名称。类名称总是解读至当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:

1604944860883_4.png

对于函数跟常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。

命名空间跟动态语言特性

PHP 命名空间的实现深受其语言自身的动态特性的影响。因此,如果要将下边的代码转化至命名空间中,动态访问元素应当使用完全限定名称(包括命名空间前缀的类名称)。

example1.php 文件代码:

注意:因为在动态的类名称、函数名称或常量名称中,限定名称跟完全限定名称没有差别,因此其前导的反斜杠是不必要的。

动态访问命名空间的元素

命名空间的次序

自从有了命名空间以后,最容易出错的该是使用类的时侯,这个类的找寻路径是什么样的了。

名称解读依照下述规则:

1.对完全限定名称的函数,类跟常量的读取在编译时解读。例如 new \A\B 解析为类 A\B。

2.所有的非限定名称跟限定名称(非完全限定名称)根据当前的导出规则在编译时进行转化。例如,如果命名空间 A\B\C 被导出为 C,那么对 C\D\e() 的读取都会被转化为 A\B\C\D\e()。

3.在命名空间内部,所有的没有按照导出规则转化的限定名称均会在其后面加上当前的命名空间名称。例如,在命名空间 A\B 内部读取 C\D\e(),则 C\D\e() 会被转化为 A\B\C\D\e() 。

4.非限定类名按照当前的导出规则在编译时转化(用真名取代短的导出名称)。例如php命名空间视频,如果命名空间 A\B\C 导入为C,则 new C() 被转化为 new A\B\C() 。

5.在命名空间内部(例如A\B),对非限定名称的函数读取是在运行时解读的。例如对函数 foo() 的读取是这么解读的:

在当前命名空间中查找名为 A\B\foo() 的函数

尝试查找并读取 全局(global) 空间中的函数 foo()。

在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的读取是在运行时解读的。

6.下面是读取 new C() 及 new D\E() 的解读过程:

new C()的解读:

在当前命名空间中查找A\B\C类。尝试手动装载类A\B\C。

new D\E()的解读:

在类名称后面加上当前命名空间名称弄成:A\B\D\E,然后查找该类。尝试手动装载类 A\B\D\E。

为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。

全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称坐落其它的命名空间中时只是这么。

子命名空间

与目录跟文件的关系太象,PHP 命名空间也容许指定层次化的命名空间的名称。因此,命名空间的昵称可以使用分层次的形式定义:

上面的事例争创了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值