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

目录:

  • 测试数据

  • 基础的写法(复杂)

  • 可读性高的写法(简明许多)

  • php7 的写法(更加清晰)

    • 非混合模式的use声明

    • 混合模式的use声明

    • 复合模式的use声明

测试数据

注意:测试目录及其命名没有按照标准规范定义目录,定义文件名及命名空间,只为展示php新特征而临时数据。

注意:加载类的方式有两种:⑴通过类似include等显示要加载类。⑵通过 __autoload 函数来加载所有的类文件,这里只为测试所以使用了第一种方式

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

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

<?php
namespace Includes\Code;

class Mysql
{
    public function get() : string
    {
        return get_class();
    }
}
  • mysqli.php

<?php
namespace Includes\Code;

class Mysqli
{
    public function get() : string
    {
        return get_class();
    }
}
  • pdo.php

<?php
namespace Includes\Code;

class Pdo
{
    public function get() : string
    {
        return get_class();
    }
}
  • file.php

<?php
namespace Includes\Code;

class File
{
    public function get() : string
    {
        return get_class();
    }
}
  • constants.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
namespace Includes\Code;

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

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

基础的写法(复杂):

  • index.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
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代码,其他的不变

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

混合模式的use声明

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

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声明,代码如下

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

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

Last updated