PHP面向对象03:命名空间

本文介绍了PHP中的命名空间概念,包括基础用法、子空间创建、不同类型的访问方式(非限定、限定、完全限定),以及全局空间的作用。此外,还讨论了命名空间在实际项目中的应用,如文件组织和类库引用,并提到了命名空间的引入机制,如use关键字的使用。

一、命名空间基础

  • namespace,是指人为的将内存进行分隔,让不同内存区域的同名结构共存。
  • 基本语法:namespace 空间名字;
  • 作用:能够创建同名结构,包括函数、常量、类。
    在这里插入图片描述
  • 注意事项:
    1. 命名空间的声明必须在所有代码之前。
    2. 一个文件中只定义一个空间。

二、子空间

  • 命名空间子空间通过namespace+路径符号\实现
<?php
# 创建一级空间
namespace my_space;

# 创建子空间
namespace my_space\space1;
  • 也可以直接创建子空间

三、命名空间访问

1. 非限定名称

  • 直接访问空间元素的名字,此类访问的时当前代码所属空间内的元素。
  • 非限定名称访问就好比是访问当前自己文件夹下的所有文件。
<?php
namespace my_space;
function show(){
    echo __METHOD__;
}
# 非限定访问
show();

2. 限定名称

  • 在访问元素的前面使用相应的空间名字,限定名称访问时基于子空间来实现的。
  • 使用自己当前的子空间名字 + \ + 元素名称
  • 限定名称访问就好比是访问当前自己文件夹下的子文件夹内容。
<?php
namespace my_space\space1;
function show(){
    echo __NAMESPACE__;
}

namespace my_space;
function show(){
    echo __NAMESPACE__;
}

# 限定名称访问
space1\show();

3. 完全限定名称

  • 从根目录(全局空间)开始访问,使用\作为全局空间开始符号。
  • 完全限定名称访问就好比从磁盘根目录访问对应路径下的内容。
<?php
namespace my_space\space1;
function show(){
    echo __NAMESPACE__;
}

namespace my_space;
function show(){
    echo __NAMESPACE__;
}

# 完全限定名称访问
\my_space\space1\show();

四、全局空间

  • 即空间元素在没有定义空间的情况下所属的空间,也是所有定义的空间的顶级空间。
  • 全局空间没有名字。
    在这里插入图片描述
  • 所有的空间本质上都是在全局空间下划分的。
  • 全局空间元素的访问:使用完全限定名称访问。

在这里插入图片描述

  • 一旦命名空间出现,那么空间元素的访问就被限定在空间内。如果使用非限定名称访问,那么系统会以下解析逻辑:
    1. 首先一定在自己空间内查找
    2. 如果找不到元素,不同空间元素的处理不同
      • 系统常量、系统函数如果找不到,会自动去全局空间找
      • 系统类不会自动取全局空间找,而是直接报错

在这里插入图片描述

  • 如果一个文件有空间包含了一个没有空间的文件,那么要访问文件中的内容,需要使用全局空间 \

五、命名空间应用

  1. 创建文件夹:

    • root:根目录,存放用户可以直接访问的文件,比如入口,访问controller里的文件。
    • controller:存放业务逻辑文件,所有业务都是类文件,业务需要操作数据库,请求model里的文件。
    • model:存放数据库操作的类文件,一张表一个类文件。
    • core:存放核心工具
      在这里插入图片描述
  2. 编写代码

    • /core/DB.php
      <?php
      namespace core;
      class DB{
          public function __construct() {
              echo "数据库初始化" . "->";
          }
      
          public function query() {
              echo "数据查询" . "->";
          }
      }
      
    • /model/User.php
      <?php
      
      namespace model;
      
      use core\DB;
      
      include_once __DIR__ . "/../core/DB.php";
      
      class User {
          public function getAllUsers() {
              $sql = "select * from User";
              $db = new \core\DB();
              $db->query($sql);
              echo "查询所有用户数据" . "->";
          }
      }
      
    • /controller/User.php
      <?php
      
      namespace controller;
      include_once __DIR__ . "/../model/User.php";
      
      class User {
          public function index() {
              $u = new \model\User();
              $u->getAllUsers();
              echo '实现了用户业务操作' . "->";
          }
      }
      
    • /index.php
      <?php
      
      include_once "controller/User.php";
      
      $u = new \controller\User();
      $u->index();
      

在这里插入图片描述

六、命名空间引入

  1. 命名空间引入,就是将另外一个空间的元素(类、函数和常量)引入到当前空间来,当作当前空间的元素访问,从而可以减少复杂的完全限定名称访问,取而代之的是非限定名称访问。
  2. use进行空间包含时,默认是从全局空间开始构建空间路径。
  3. 空间引入的元素默认是类,如果要引入其他元素,就必须使用响应关键字:functionconst
  4. 如果引入空间元素与本空间元素重名,使用as关键字。
  5. 引入的多种情况
    • 引入一个空间中的多个同种(类、函数、常量)元素,可以使用,分隔。
    • 引入一个空间中的不同种元素,使用use space\{Human, function show as my_show, const P};
    • 引入一个空间中的所有元素,直接引入空间use space;,但是会被当做子空间,使用元素时需要使用限定名称访问(不常使用,不方便)。
<?php

namespace space1;
class Man {
    public function __construct() {
        echo __METHOD__;
    }
}
function show() {
    echo __METHOD__;
}
const P = 3;


namespace space2;
// 引入空间元素
use space1\Man;
// 引入函数
use function space1\show as my_show;
// 引入常量
use const space1\P;

$man = new Man();
my_show();
echo P;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iFulling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值