PHP中命名空间是怎样的存在(一)?

命名空间其实早在PHP5.3就已经出现了。不过大部分同窗可能在各类框架的使用中才会接触到命名空间的内容,固然,现代化的开发也都离不开这些可以快速产出的框架。此次咱们不从框架的角度,仅从简单的代码角度来解析一下命名空间的概念和使用。php

首先,咱们要定义命名空间是个什么东西。git

其实就像操做系统的目录同样,命名空间就是为了解决相似于操做系统中同一个文件夹不能有相同的文件名同样的问题。假设咱们只有一个文件,一个目录,那么在这个目录中,是不能有两个彻底相同的文件的。若是有这样名称彻底相同的文件,那么操做系统也不知道咱们到底应该打开的是哪个文件。同理,在一个PHP文件中,咱们也不能起相同名称的函数或者类名,PHP也不知道咱们到底要调用的是哪个函数或者类。github

理解了上述内容以后,再来看命名空间的语法,其实很是像咱们的目录的定义。微信

namespace A\B\C;

这个命名空间的定义就是指出了当前命名空间是A\B\C。就像是C:\A\B\C这样一个文件夹同样。光说不练假把式,直接上代码来看看:composer

// file1.php
namespace FILE1;

const CONST_A = 2;
function testA(){
    echo 'FILE1\testA()', PHP_EOL;
}

class objectA{
    function test(){
        echo 'FILE1\ObjectA', PHP_EOL;
    }
}
// file2.php
namespace FILE2;

const CONST_A = 3;
function testA(){
    echo 'FILE2\testA()', PHP_EOL;
}

class objectA{
    function test(){
        echo 'FILE2\ObjectA', PHP_EOL;
    }
}

咱们在namespace目录下建立了这两个php文件,函数和类名都是同样的,但定义了不一样的命名空间,一个是FILE1,一个是FILE2。框架

namespace A;

include 'namespace/file1.php';
include 'namespace/file2.php';

use FILE1, FILE2;
use FILE1\objectA as objectB;

const CONST_A = 1;
function testA(){
    echo 'A\testA()', PHP_EOL;
}

class objectA{
    function test(){
        echo 'A\ObjectA', PHP_EOL;
    }
}

// 当前命名空间
echo CONST_A, PHP_EOL; // 1
testA(); // A\testA()
$oA = new objectA();
$oA->test(); // A\ObjectA

// FILE1
echo FILE1\CONST_A, PHP_EOL; // 2
FILE1\testA(); // FILE1\testA()
$oA = new FILE1\objectA();
$oA->test(); // FILE1\ObjectA

$oB = new objectB();
$oB->test(); // FILE1\ObjectA

// FILE2
echo FILE2\CONST_A, PHP_EOL; // 3
FILE2\testA(); // FILE2\testA()
$oA = new FILE2\objectA();
$oA->test(); // FILE2\ObjectA

在测试代码中,咱们又定义了当前的命名空间为A。并include了file1.php和file2.php。并在这个文件中同时也定义了与file1.php和file2.php中相同的函数和类名。接下来咱们依次调用这些静态变量、函数和类。函数

  • 在默认状况下,静态变量、函数、类调用的是当前命名空间下的内容
  • 在使用了FILE1\和FILE2\以后,调用的是就是指定命名空间下的内容
  • 须要使用use引入命名空间,不然没法使用命名空间里的内容
  • use中可使用as关键字为命名空间或者其中的类指定别名

命名空间的使用其实就是这么的简单。能够看出咱们在不一样的命名空间中就可使用相同的函数或者类名了。这一点正是各种现代化开发框架的基础。同时也是composer可以实现的最主要的缘由之一。学习

接下来,咱们尝试一个问题是否符合咱们的预期,那就是两个文件定义相同的命名空间是否可以定义相同的类名呢?测试

// file1-1.php
namespace FILE1;

const CONST_A = 1.1;
function testA(){
    echo 'FILE1-1\testA()', PHP_EOL;
}

class objectA{
    function test(){
        echo 'FILE1-1\ObjectA', PHP_EOL;
    }
}

咱们定义了一个file1-1.php,而且使用了和file1.php相同的FILE1命名空间。而后和file1.php一块儿include到测试代码中。spa

include 'namespace/file1.php';
include 'namespace/file1-1.php'; // Cannot redeclare FILE1\testA()

好吧,在运行时直接就报错,不能重复定义同名的函数名。若是注释掉函数,那么会继续报类名不能重复。咱们再定义一个file1-2.php,此次仍是使用FILE1这个命名空间,可是内容不同了。

// file1-2.php
namespace FILE1;

const CONST_A = 1.2;
function testA1_2(){
    echo 'FILE1-2\testA()', PHP_EOL;
}

class objectA1_2{
    function test(){
        echo 'FILE1-2\ObjectA', PHP_EOL;
    }
}

这样固然就没问题啦。这两个文件在同一个命名空间下,可是却有着不一样的能力,这样是彻底OK的操做。

include 'namespace/file1.php';
include 'namespace/file1-2.php';
use FILE1;

// FILE1
echo FILE1\CONST_A, PHP_EOL; // 2
FILE1\testA(); // FILE1\testA()
$oA = new FILE1\objectA();
$oA->test(); // FILE1\ObjectA

// FILE1_2
echo FILE1\CONST_A, PHP_EOL; // 3
FILE1\testA1_2(); // FILE1-2\testA()
$oA = new FILE1\objectA1_2();
$oA->test(); // FILE1-2\ObjectA

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%B8%80%EF%BC%89.php

参考文档:
https://www.php.net/manual/zh/language.namespaces.rationale.php
https://www.php.net/manual/zh/language.namespaces.definition.php

===============

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

相关文章
相关标签/搜索