> For the complete documentation index, see [llms.txt](https://php7.shujuwajue.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://php7.shujuwajue.com/php-70x-xin-te-xing/oop-te-xing/ming-ming-kong-jian-yu-use-guan-jian-ci-pi-liang-sheng-ming.md).

# 命名空间与use关键词批量声明

## 目录：

* 测试数据
* 基础的写法(复杂)
* 可读性高的写法（简明许多）
* php7 的写法（更加清晰）
  * 非混合模式的use声明
  * 混合模式的use声明
  * 复合模式的use声明

## **测试数据**

> 注意：测试目录及其命名没有按照标准规范定义目录，定义文件名及命名空间，只为展示php新特征而临时数据。
>
> 注意：加载类的方式有两种：⑴通过类似include等显示要加载类。⑵通过 \_\_autoload 函数来加载所有的类文件，这里只为测试所以使用了第一种方式

以下libs目录文件中定义了类、函数、常量，均在Includes\Code`e命名空间下。`

```
libs目录
libs/mysql.php
libs/mysqli.php
libs/pdo.php
libs/file.php
libs/constants.php
libs/functions.php
index.php
```

* **mysql.php**

```php
<?php
namespace Includes\Code;

class Mysql
{
    public function get() : string
    {
        return get_class();
    }
}
```

* **mysqli.php**

```php
<?php
namespace Includes\Code;

class Mysqli
{
    public function get() : string
    {
        return get_class();
    }
}
```

* **pdo.php**

```php
<?php
namespace Includes\Code;

class Pdo
{
    public function get() : string
    {
        return get_class();
    }
}
```

* **file.php**

```php
<?php
namespace Includes\Code;

class File
{
    public function get() : string
    {
        return get_class();
    }
}
```

* **constants.php**

```php
<?php
namespace Includes\Code;

const DB_TYPE   = 'mysql';
const DB_HOST   = 'localhost';
const DB_NAME   = 'test';
const DB_USER   = 'root';
const DB_PWD    = '123456';
const DB_PORT   = '3306';
const DB_PREFIX = '';
```

* **functions.php**

```php
<?php
namespace Includes\Code;

function getSql() : string
{
    return 'Its sql';
}

function saveSql(string $sql) : string
{
    return $sql.' saved!';
}
```

## 基础的写法(复杂)：

* &#x20;**index.php**

```php
<?php
include 'libs/mysql.php';
include 'libs/mysqli.php';
include 'libs/pdo.php';
include 'libs/file.php';
include 'libs/constants.php';
include 'libs/functions.php';

$mysql  = new \Includes\Code\Mysql();
$mysqli = new \Includes\Code\Mysqli();
$pdo    = new \Includes\Code\Pdo();
$file   = new \Includes\Code\File();

echo \Includes\Code\getSql() . '<br>';
echo \Includes\Code\saveSql('select * from abc') . '<br>';
echo \Includes\Code\DB_USER . '<br>';
echo \Includes\Code\DB_PWD . '<br>';
```

## 可读性高的写法（简明许多）：

> 注意:PHP 5.6.0发布 use关键字可导入函数与常量

```php
<?php
include 'libs/mysql.php';
include 'libs/mysqli.php';
include 'libs/pdo.php';
include 'libs/file.php';
include 'libs/constants.php';
include 'libs/functions.php';

use Includes\Code\Mysql;
use Includes\Code\Mysqli;
use Includes\Code\Pdo;
use Includes\Code\File;
use function Includes\Code\saveSql;
use function Includes\Code\getSql;
use const Includes\Code\DB_USER;
use const Includes\Code\DB_PWD;

$mysql  = new Mysql();
$mysqli = new Mysqli();
$pdo    = new File();
$file   = new File();

echo getSql() . '<br>';
echo saveSql('select * from abc') . '<br>';

echo DB_USER . '<br>';
echo DB_PWD . '<br>';
```

在这段代码中，我通过命名空间中的PHP声明来显示引入很多的类、函数、常量。这种方法依然需要很多行复杂的代码才能表明我们希望用到的类、函数、常量等，这导致在文件中需要些很多的use声明，显得繁琐。

**为了解决这个问题，PHP7引入了批量的use声明，下面列举三种use声明的模式。**

## **php7 的写法：**

* 非混合模式的use声明
* 混合模式的use声明
* 复合模式的use声明

### 非混合模式的use声明

假设命名空间里多种类型的资源，例如类、函数、常量等，使用费混合模式的use声明，可以按照类型将它们归类后逐个用use声明。代码如下

> 这里只修改了use代码，其他的不变

```php
use Includes\Code\{ Mysql, Mysqli, Pdo, File };
use function Includes\Code\{ getSql, saveSql };
use const Includes\Code\{ DB_USER, DB_PWD };
```

### 混合模式的use声明

在这种声明方式中，将同一个命名空间下的内容合并在一起，使用一次use关键字完成全部声明，代码如下

```php
use Includes\Code\{ 
    Mysql,
    Mysqli,
    Pdo,
    File,
    function getSql,
    function saveSql,
    const DB_USER,
    const DB_PWD
};
```

### **复合模式的use声明**

举例：有一个Mysql类位于Includes\Code\Cache命名空间下，有一个File类位于Includes\Code\Index命名空间下，还有两个位于Includes\Code\Data命名空间下，那么此时，若需要use声明，代码如下

```php
use Includes\Code\{ 
    Cache\Mysql,
    Index\File,
    Data\Mysqli,
    Data\Pdo
};
```

这样的声明看上去更清晰，不必写太多的命名空间信息。
