> 文章列表 > PHP面向对象03:命名空间

PHP面向对象03:命名空间

PHP面向对象03:命名空间

PHP面向对象03:命名空间

  • 一、命名空间基础
  • 二、子空间
  • 三、命名空间访问
    • 1. 非限定名称
    • 2. 限定名称
    • 3. 完全限定名称
  • 四、全局空间
  • 五、命名空间应用
  • 六、命名空间引入

一、命名空间基础

  • namespace,是指人为的将内存进行分隔,让不同内存区域的同名结构共存。
  • 基本语法:namespace 空间名字;
  • 作用:能够创建同名结构,包括函数、常量、类。
    PHP面向对象03:命名空间
  • 注意事项:
    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();

四、全局空间

  • 即空间元素在没有定义空间的情况下所属的空间,也是所有定义的空间的顶级空间。
  • 全局空间没有名字。
    PHP面向对象03:命名空间
  • 所有的空间本质上都是在全局空间下划分的。
  • 全局空间元素的访问:使用完全限定名称访问。

PHP面向对象03:命名空间

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

PHP面向对象03:命名空间

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

五、命名空间应用

  1. 创建文件夹:

    • root:根目录,存放用户可以直接访问的文件,比如入口,访问controller里的文件。
    • controller:存放业务逻辑文件,所有业务都是类文件,业务需要操作数据库,请求model里的文件。
    • model:存放数据库操作的类文件,一张表一个类文件。
    • core:存放核心工具
      PHP面向对象03:命名空间
  2. 编写代码

    • /core/DB.php
      <?php
      namespace core;
      class DB{public function __construct() {echo "数据库初始化" . "->";}public function query() {echo "数据查询" . "->";}
      }
      
    • /model/User.php
      <?phpnamespace 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
      <?phpnamespace controller;
      include_once __DIR__ . "/../model/User.php";class User {public function index() {$u = new \\model\\User();$u->getAllUsers();echo '实现了用户业务操作' . "->";}
      }
      
    • /index.php
      <?phpinclude_once "controller/User.php";$u = new \\controller\\User();
      $u->index();
      

PHP面向对象03:命名空间

六、命名空间引入

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