东莞麻涌网站建设,网站建设工作的函,品牌推广多少钱,怎么模仿别人做网站文章目录 参考环境命名空间概念版本支持影响范围 全局命名空间概念魔术常量 \_\_NAMESPACE\_\_声明全局命名空间 声明命名空间为空间命名命名规则核心命名空间 子命名空间的声明在同一文件中定义多个命名空间无括号命名空间声明有括号命名空间声明禁止混合使用推荐使用有括号命… 文章目录 参考环境命名空间概念版本支持影响范围 全局命名空间概念魔术常量 \_\_NAMESPACE\_\_声明全局命名空间 声明命名空间为空间命名命名规则核心命名空间 子命名空间的声明在同一文件中定义多个命名空间无括号命名空间声明有括号命名空间声明禁止混合使用推荐使用有括号命名空间声明 注意事项命名空间之外命名空间之间不允许嵌套 参考
项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 官方PHP ManualPHP 官方language.namespaces.rationale.phpPHP 官方control-structures.declare.php
环境
项目描述PHP5.5.0、5.6.8、7.0.0、7.2.5、7.4.9、8.0.0、8.2.9PHP 编辑器PhpStorm 2023.1.1专业版
命名空间
概念
如何理解 PHP 中的命名空间PHP 官方文档 对此有一个很好的描述难得通俗易懂
什么是命名空间从广义上来说命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如在操作系统中目录用来将相关文件分组对于目录中的文件来说它就扮演了命名空间的角色。具体举个例子文件 foo.txt 可以同时在目录 /home/greg 和 /home/other 中存在但在同一个目录中不能存在两个 foo.txt 文件。另外在目录 /home/greg 外访问 foo.txt 文件时我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。 在 PHP 中命名空间 用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题
用户编写的代码与 PHP 内部或第三方的类、函数、常量等之间的 命名冲突。为 很长的标识符名称通常是为了缓解第一类问题而定义的 创建一个 别名简短的名称 的名称提高源代码的可读性。
版本支持
PHP 对命名空间的支持从 5.3 版本开始在此前的 PHP 版本中命名空间机制处于不可用状态。
影响范围
PHP 中并不是所有组成部分都将受到命名空间的影响。在 PHP 官方文档中 记录了受命名空间影响的类型具体如下
类包括抽象类和 trait接口函数常量 全局命名空间
概念
在 PHP 中全局命名空间是一个 特殊的命名空间该命名空间 没有具体的名称。全局命名空间是 PHP 脚本使用的 默认命名空间当你在 PHP 脚本中没有显式地定义命名空间时所有的类、函数、常量等都处于全局命名空间中。
魔术常量 __NAMESPACE__
__NAMESPACE__ 是 PHP 提供的一个魔术常量用于获取当前命名空间的名称。您可以在任何命名空间内使用魔术常量 __NAMESPACE__它将返回 一个包含当前命名空间名称的字符串。
举个栗子
?phpfunction func() {return __NAMESPACE__;
}var_dump(__NAMESPACE__);
var_dump(func());执行效果
由于 全局命名空间没有具体的名称故在全局命名空间中访问 __NAMESPACE__ 常量将获得一个空字符串。
string(0)
string(0) 声明全局命名空间
在 PHP 中使用 namespace 关键字用于命名空间的定义。定义全局命名空间可参考如下示例
?phpnamespace {# 括号范围内即全局命名空间。var_dump(__NAMESPACE__);
}执行效果
string(0) 声明命名空间
为空间命名
在定义命名空间的过程中可在 namespace 关键字后指定被定义命名空间的名称。对此请参考如下示例
?php# 定义一个名为 RedHeart 的命名空间
namespace RedHeart {var_dump(__NAMESPACE__);
}# 定义一个名为 BinaryMoon\RedHeart 的命名空间
namespace BinaryMoon\RedHeart {var_dump(__NAMESPACE__);
}执行效果
string(8) RedHeart
string(19) BinaryMoon\RedHeart命名规则
命名空间的名称 只能包含字母、数字和下划线并且不能以数字开头。需要注意的是命名空间的名称的大小写并不敏感\RedHeart 与 \REDHEART 将被视为同一命名空间。对此请参考如下示例
?phpnamespace RedHeart {# 名为 RedHeart 的命名空间中定义一个名为 HOME 的常量const HOME BinaryMoon;
}namespace REDHEART {# 尝试在名为 REDHEART 的命名空间中对 HOME 常量进行访问var_dump(HOME);
}执行效果
在 RedHeart 命名空间中的常量被 REDHEART 命名空间中的语句成功访问这说明两者为同一命名空间命名空间的名称是 不区分大小写的。
string(10) BinaryMoon核心命名空间
在 PHP 中以 PHP 作为名称开头的命名空间通常用于表示 PHP 本身的 核心命名空间。这些命名空间用于组织 PHP 语言 内置的类、接口、函数和常量。虽然您可以在自己的代码中创建以 PHP 开头的命名空间但最好不要这样做以 避免混淆和冲突。
子命名空间的声明
在 PHP 中子命名空间是指在一个已存在的命名空间内创建 更具体或更深层次的命名空间。子命名空间是一种用于更好组织和分类代码的方式允许您 在一个已有的命名空间下创建更多的子级命名空间。子级命名空间与父级命名空间之间使用斜杠 \ 进行分隔。对此请参考如下内容
?phpnamespace RedHeart {# 创建一个位于全局命名空间下名为 RedHeart 的子命名空间
}namespace RedHeart\BinaryMoon {# 创建一个位于 \RedHeart\ 下的子空间# \RedHeart 前的 \ 表示全局命名空间在为命名空间命名时不需要添加# 该符号。否则PHP 将抛出 Parse error 异常。
}在同一文件中定义多个命名空间
无括号命名空间声明
无括号命名空间声明 使用分号 ; 结束命名空间的声明。当您使用这种方式定义命名空间时命名空间的影响将持续到文件的结束或下一个命名空间声明。也就是说此声明之后的所有代码都将被认为是在这个命名空间内。
有括号命名空间声明
有括号命名空间声明 使用大括号 {} 来明确地定义命名空间的范围。在这对大括号内的代码都将被认为是在这个命名空间内而大括号外的代码则不在此命名空间内。
禁止混合使用
在同一 PHP 脚本文件中有括号命名空间声明与无括号命名空间声明 不能混用。否则PHP 将为此抛出 Fatal error 异常并立即停止运行。对此请参考如下示例
?php# 使用无括号命名空间声明
namespace RedHeart;# 使用有括号命名空间声明
namespace BinaryMoon {}执行效果
Fatal error: Cannot mix bracketed namespace declarations with unbracketed namespace declarations in C:\demo.php on line 8
PHP Fatal error: Cannot mix bracketed namespace declarations with unbracketed namespace declarations in C:\demo.php on line 8推荐使用有括号命名空间声明
在 PHP 中定义命名空间的过程中推荐使用有括号命名空间声明。理由有如下三点
可读性 使用有括号命名空间声明 可以明确指示命名空间的开始和结束使代码更易于阅读。全局命名空间 全局命名空间的声明 仅能够通过有括号命名空间声明这一方式进行声明若在 PHP 脚本文件中使用无括号命名空间声明则 无法声明全局命名空间有括号命名空间声明与无括号命名空间声明不可混用。
注意事项
命名空间之外
当您在 PHP 脚本中 声明任意命名空间 后仅能够在所有命名空间前使用 declare 语句及 PHP 起始标签 ?php。除此之外不允许在名称空间范围外使用任何非空白字符。否则PHP 将抛出 Fatal error 并立即停止运行。对此请参考如下示例
产生 Fatal error 异常
!DOCTYPE html
html langen
headmeta charsetUTF-8titleNamespace/title
/head
body?phpnamespace BinaryMoon;?
/body
/html正常运行
?php# declare 的功能不必在意此处仅仅为了表达
# 仅有 PHP 起始标签与 declare 语句可以出现在所有命名空间之前之外。
declare(ticks1);
namespace BinaryMoon {}命名空间之间不允许嵌套
使用有括号命名空间会让人尝试进行命名空间嵌套但这是不被 PHP 允许的若您尝试这样做PHP 将抛出 Fatal Error 异常。对此请参考如下示例
?phpnamespace RedHeart {# 尝试在 RedHeart 命名空间内部声明 BinaryMoon 命名空间namespace BinaryMoon {}
}执行效果
PHP Fatal error: Namespace declarations cannot be nested in C:\test.php on line 6