PHP 命名空间(namespace)

命名空间()定义命名空间子命名空间命名空间也允许指定层次化的命名空间的名称。命名空间使用必须使用完全限定名称(包括命名空间前缀的类名称)。在命名空间中的代码使用命名空间:别名/导入有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:命名空间的顺序

以下为知识DOC为大家进行整理的相关内容,希望对大家有所帮助!

PHP 命名空间()

PHP 命名空间()是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。

PHP 命名空间可以解决以下两类问题:

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。定义命名空间

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;

<?php  // 定义代码在 'MyProject' 命名空间中  namespace MyProject;   // ... 代码 ...  

你也可以在同一个文件中定义不同的命名空间代码,如:

  

不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。

将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 语句加上大括号括起来,例如:

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。

<?phpdeclare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}namespace { // 全局代码session_start();$a = MyProjectconnect();echo MyProjectConnection::start();}

空间名称_空间相册名称_qq空间名称加长

?>

以下代码会出现语法错误:

<?phpnamespace MyProject; // 命名空间前出现了“” 会致命错误 - 命名空间必须是程序脚本的第一条语句?>

子命名空间

与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

上面的例子创建了常量 SubLevel,类 SubLevel 和函数 SubLevel。

命名空间使用

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

非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::();。如果当前命名空间是 ,foo 将被解析为 foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码空间名称,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义空间名称,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

限定名称,或包含前缀的名称,例如 $a = new foo(); 或 foo::();。如果当前的命名空间是 ,则 foo 会被解析为 \foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为foo。

完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \foo(); 或 \foo::();。在这种情况下,foo 总是被解析为代码中的文字名( name)foo。

下面是一个使用这三种方式的实例:

file1.php 文件代码

file2.php 文件代码

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

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

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

命名空间和动态语言特征

PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

.php 文件代码:

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。

动态访问命名空间的元素

关键字和常量

PHP支持两种抽象的访问当前命名空间内部元素的方法, 魔术常量和关键字。

空间名称_qq空间名称加长_空间相册名称

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

示例, 在命名空间中的代码

示例,全局代码

常量 在动态创建名称时很有用,例如:

使用动态创建名称

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

操作符,命名空间中的代码

操作符, 全局代码

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

PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。

在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:

1、使用use操作符导入/使用别名

<?phpnamespace foo;use MyFullClassname as Another;// 下面的例子与 use MyFullNSname as NSname 相同use MyFullNSname;// 导入一个全局类use ArrayObject;$obj = new namespaceAnother; // 实例化 fooAnother 对象$obj = new Another; // 实例化 MyFullClassname 对象NSnamesubnsfunc(); // 调用函数 MyFullNSnamesubnsfunc

空间名称_空间相册名称_qq空间名称加长

$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use ArrayObject" ,则实例化一个 fooArrayObject 对象 ?>

2、 一行中包含多个use语句

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

3、导入和动态名称

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

4、导入和完全限定名称

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

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

1、在命名空间中访问全局类

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

2、 命名空间中后备的全局函数/常量

全局空间

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

使用全局空间说明

命名空间的顺序

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

名称解析遵循下列规则:

对完全限定名称的函数,类和常量的调用在编译时解析。例如new AB 解析为类 AB。所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间ABC 被导入为 C,那么对 CDe()的调用就会被转换为 ABCDe()。在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间AB 内部调用 CDe(),则 CDe()会被转换为 ABCDe() 。非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间ABC 导入为C,则 new C()被转换为 new ABC() 。在命名空间内部(例如AB),对非限定名称的函数调用是在运行时解析的。例如对函数foo() 的调用是这样解析的:在当前命名空间中查找名为 ABfoo() 的函数尝试查找并调用 全局() 空间中的函数 foo()。在命名空间(例如AB)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用new C() 及 new DE() 的解析过程: new C()的解析:在当前命名空间中查找ABC类。尝试自动装载类ABC。 new DE()的解析:在类名称前面加上当前命名空间名称变成:ABDE,然后查找该类。尝试自动装载类 ABDE。为了引用全局命名空间中的全局类,必须使用完全限定名称 new C()。

本文地址: https://www.zhishidoc.com/28617.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 859089669@qq.com 举报,一经查实,本站将立刻删除。

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年11月1日 上午1:25
下一篇 2022年11月1日 上午1:28

相关推荐

  • 生日最暖心短句6字文案青春永驻,生日祝青春永驻句子?

    一、生日祝青春永驻句子?三、60岁生日祝福语八个字?四、60岁女人生日祝福词青春永驻?六、生日最暖心短句?生日最暧心短句是:祝你生日快乐,祝你永远幸福快乐。生日暖心短句:祝您生日快乐。只有6个字的祝福短句,还有:生日幸福。4个字的生日短句,还有:生日好!3个字的生日短句。八、18岁生日古风文案短句干净?6、没有文案,祝自己十八岁生日快乐!一句暖心的生日祝福语

    2022年10月18日
    10900
  • 送走2020,迎接2021的优美祝福句子,致2021的话

    1、送走2020,迎接2021,李兆香送你一声新年好,好运时刻守着你,真心真意祝福你,吉祥如意事事顺。6、每一个平淡的日子都值得尊重,每一个还在身边的人都需要珍惜,认真告别,用力重逢!16、2021到,李兆香祝各位新年到心情好,新年到财运到,新年到转折到。19、女生2021致自己的一句话:不做任何人的公主,只做自己的女王。2021年好好生活,慢慢相遇,保持热爱,奔赴山海。

    2022年10月13日
    17800
  • 学生13个完美请假借口

    学生13个完美请假借口(上班族也适用,各种请假借口)。学生13个完美请假借口请假借口1:我今天腿疼不愿意上课,或者为了自己上课迟到找理由。为了自己上学迟到找理由。请假借口10、牙齿出问题请假借口12、女生就是生理期痛,很严重那种。请假借口13、要去办理证件,必须工作日去。请假无法拒绝的十大理由:1、请假最好选一定要工作日才能完成或者周末没法办的事情,这样领导更容易批,也不容易被怼回来

    2022年10月30日
    12700
  • 吃夜宵发朋友圈的句子

    吃夜宵的朋友圈说说句子1、今天吃宵夜了吗,要长胖的哦!2、喜欢吃宵夜的人,身体必胖无疑。我想吃火锅。8、有没有人借我50块钱,吃夜宵。吃夜宵发朋友圈的句子有哪些呢line吃夜宵的朋友圈说说如下:随便吃点夜宵,烧烤还得是家里的!全部身边的人都在吃夜宵!以后晚上一定不要吃宵夜了。有没有人借我50块钱,吃夜宵。最近大家都说我长胖了,一个是叫我吃宵夜,另一个天天做宵夜给我。今晚想吃小龙虾。

    2022年11月6日
    18300
  • 那些令人心碎的句子,句句心痛伤感,深爱过的人都懂

    我最害怕的俩种态度,一种是暧昧不明,一种是忽冷忽热。 相传幸福是个美丽的玻璃球,跌碎散落在世间的每个角落。 像所有传闻里陈词滥调的故事:你离开了,我才如此想念。 眼泪是真的,心酸也是真的,当初想和你一辈子也是真的。 一条路成千上万人在走,我不知道你会与我并肩还是擦身。 你以为最酸的感觉是吃醋吗?不是,最酸的感觉是没权吃醋。 “以后还有机会的”,这句话让我们做…

    2022年8月12日
    12900

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注