• php 命名空间


    命名空间是为了解决当前文件内相同作用域内常量名之间、函数名之间、类名之间的命名冲突。

    在 PHP 中变量名是不会冲突的,在相同作用域内,对于同一个变量,最后一个变量会取代前一个变量的值。

    举例

    同一作用域,相同变量

    1. $a = '123';
    2. $a = '456';
    3. $a = '789';
    4. echo $a; //显示 789

    代码编辑器不报错,PHP运行结果不报错,显示最后一个 $a 的值。

    同一作用域,相同常量

    1. const a = '123';
    2. const a = '356';
    3. const a = '789';
    4. echo a //显示 123

    代码编辑器报错,PHP运行结果不报错,显示第一个常量 a 的值。

    常量换成 define 定义

    1. define('a',123);
    2. define('a',456);
    3. define('a',789);
    4. echo a; //显示 123

    代码编辑器报错,PHP运行结果不报错,显示第一个常量 a 的值,和 const 定义常量的结果一样。

    同一作用域,相同函数

    1. function a(){
    2. echo '123';
    3. }
    4. function a(){
    5. echo '456';
    6. }
    7. a(); // PHP 运行结果报错 Cannot redeclare a()

    代码编辑器报错,PHP 运行结果报错。

    同一作用域,相同类

    1. class A{
    2. public function __construct()
    3. {
    4. echo '123';
    5. }
    6. }
    7. class A{
    8. public function __construct()
    9. {
    10. echo '456';
    11. }
    12. }
    13. new A(); // PHP 运行结果报错
    14. //Fatal error: Cannot declare class A, because the name is already in use in

    代码编辑器报错,PHP 运行结果报错。

    在编程中,如果代码全都是自己一个人完成的,常量名之间、函数名之间、类名之间可能不会出现重名的情况,但是在实际的工作中,

    1、大多数任务都是需要团队协作来完成,我们要如何保证自己起的常量名、函数名、类名不会和别人起的名字出现重名的状况?

    2、我们要用到别人开发的框架时,要如何保证自己起的常量名、函数名、类名不会和框架的常量名、函数名、类名出现重名的状况?

    为了解决这两个问题,命名空间这项技术出现了。

    1. PHP
    2. namespace 命名空间名称;

    其实命名空间,说白了,就是给相同的常量、函数、类的名字前面添加不同的前缀,这样它们的名字就不相同了。

    举例

    1. namespace a; //命名空间 a
    2. class ABC {
    3. public function __construct()
    4. {
    5. echo 123;
    6. }
    7. }
    8. namespace b; //命名空间 b
    9. class ABC {
    10. public function __construct()
    11. {
    12. echo 456;
    13. }
    14. }

    不会报错,因为这两个类在不同的命名空间下,

    在命名空间 a 下的类 ABC 名字已经变成 \a\ABC,

    在命名空间 b 下的类 ABC 名字已经变成 \b\ABC。

    当一个文件内有多个命名空间,当前命名空间关键字 namespace 到下个命名空间关键字 namespace  之间的代码都属于当前命名空间。

     在当前命名空间使用其它命名空间的代码

    1. namespace a;
    2. class ABC {
    3. public function __construct()
    4. {
    5. echo 123;
    6. }
    7. }
    8. namespace b;
    9. class ABC {
    10. public function __construct()
    11. {
    12. echo 456;
    13. }
    14. }
    15. namespace c;
    16. new \a\ABC(); //在命名空间 c 中实例化命名空间 a 中的 ABC 类 ,输出 123
    17. /*
    18. 因为当前代码所在的命名空间是 c 命名空间, 而 a 命名空间是定义在根命名空间下,
    19. 所以在 c 命名空间使用 a 命名空间时, a 命名空间前面要加一个反斜杠 \ ,这个反斜杠
    20. 代表根命名空间,如果没有这个反斜杠,new a\ABC() 会以当前命名空间 c 为开头,
    21. 即 new \c\a\ABC(),会报错( Fatal error: Uncaught Error: Class 'c\a\ABC' not found )
    22. 因为 \c\a\ 这个命名空间下没有 ABC 类
    23. */
    24. new \b\ABC(); //在命名空间 c 中实例化命名空间 b 中的 ABC 类 ,输出 456

  • 相关阅读:
    龙蜥白皮书精选:龙蜥安全漏洞管理体系介绍
    Pro_07丨波动率因子3.0与斜率因子
    小鱼送激光雷达啦 | 恰饭即抽奖第一期
    第十一章 GetAway服务网关详解
    【开课预告】下半年软考(中/高级)认证将于8月20日开班
    企业架构LNMP学习笔记49
    AI、元宇宙与Web3:数字化前沿的三大核心驱动力
    python基础及网络爬虫
    Windows10神州网信政府版的配置修改
    RocketMQ特性--Broker是如何存储事务消息的?
  • 原文地址:https://blog.csdn.net/weixin_44161401/article/details/126679753