php命名空间的理解

时间:2023-01-17 08:35:05

命名空间概述

这是只是大概讲一下用法,如果想详细了解,还是阅读官方手册比较好。

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

版本要求

php5.3.0以上,包含php5.3.0

开始讲解

新建a.phpb.php文件

## 这是a.php
namespace a\b\c; // 说明这个类存在于 a\b\c 这个命名空间下
class Apple{
function get_func(){
echo 'This is a';
}
}
## 这是b.php
namespace a\b\d; // 说明这个类存在于 a\b\d 这个命名空间下
class Apple{
function get_func(){
echo 'This is b';
}
}

我们再新建一个test.php去调用上面这两个类

## 这是test.php
require_once "./a.php";
require_once "./b.php";
// 如果没有命名空间,直接引入,会报类重复的错误

// 那我们该如何实例化上面类呢?
$apple_a = new a\b\c\Apple();
echo $apple_a->get_func(); // This is a
// 这种方法是可以的,但是试想如果我们同个页面要多次实例化此类,这样是非常耗资源的。
## 这是test.php
require_once "./a.php";
require_once "./b.php";
use a\b\c\Apple;

$apple_a = new Apple();
$apple_a1 = new Apple();
$apple_a2 = new Apple();
echo $apple_a->get_func(); // This is a
echo $apple_a1->get_func(); // This is a
echo $apple_a2->get_func(); // This is a
// 这样写同样也是可以的,而且会比上面那种方法省资源
// 在这里思考一下,如果想执行b.php文件的类,该怎么执行呢?
## 这是test.php
require_once "./a.php";
require_once "./b.php";
use a\b\c\Apple;

$apple_a = new Apple();
.....(此处省略,上面重复).....
$apple_b = new a\b\d\Apple();
echo $apple_b->get_func(); // This is b
// 如果我们也像使用上面那种方法引入b.php文件的类,该如何做到呢?
## 这是test.php
require_once "./a.php";
require_once "./b.php";
use a\b\c\Apple;
use a\b\d\Apple as BApple; // 如果想两个同名的类一起使用,就得给它赋个新类名

$apple_a = new Apple();
echo $apple_a->get_func(); // This is a

$apple_b = new BApple();
echo $apple_b->get_func(); // This is b
// 同样,这也成功输出了

这时我们新建一个c.php文件

## 这是c.php
class Apple{
function get_func(){
echo 'This is c';
}
}
// 我们没有在这个类文件下配命名空间
## 这是test.php
require_once "./a.php";
require_once "./b.php";
require_once "./c.php";
use a\b\c\Apple;
.....(此处省略,上面重复).....
// 如果没有配命名空间,代表根类,就得这样实例化,就可以成功找到了
$apple_c = new \Apple();
$apple_c->get_func(); // This is c