命名空间其实早在PHP5.3就出现了。但是大部分同学可能只是在各种框架的使用中才接触到命名空间的内容。当然,现代的发展也离不开这些可以快速生产的框架。本次我们将不从框架的角度,而是从简单代码的角度来分析命名空间的概念和使用。首先,我们需要定义什么是命名空间。其实命名空间就像操作系统的目录一样,就是为了解决类似于操作系统中同一个文件夹不能有相同文件名的问题。假设我们只有一个文件和一个目录,那么在这个目录下,不可能有两个相同的文件。如果有这样的同名文件,操作系统就不知道我们应该打开哪个文件。同样的,在一个PHP文件中,我们不能命名函数或类同名,PHP也不知道我们要调用哪个函数或类。了解了上面的内容之后,我们再来看命名空间的语法,其实和我们定义目录很相似。命名空间A\B\C;这个命名空间的定义是为了指出当前命名空间是A\B\C。就像C:\A\B\C这样的文件夹。光说不练套路,直接上代码看://file1.phpnamespaceFILE1;constCONST_A=2;functiontestA(){echo'FILE1\testA()',PHP_EOL;}classobjectA{函数测试(){echo'FILE1\ObjectA',PHP_EOL;}}//file2.phpnamespaceFILE2;constCONST_A=3;functiontestA(){echo'FILE2\testA()',PHP_EOL;}classobjectA{functiontest(){echo'FILE2\ObjectA',PHP_EOL;}}我们在命名空间目录下创建了这两个php文件,函数名和类名相同,只是定义了不同的命名空间,一个是FILE1,一个是FILE2。namespaceA;include'namespace/file1.php';include'namespace/file2.php';useFILE1,FILE2;useFILE1\objectAasobjectB;constCONST_A=1;functiontestA(){echo'A\testA();',PHP_EOL;}classobjectA{functiontest(){echo'A\ObjectA',PHP_EOL;}}//当前命名空间echoCONST_A,PHP_EOL;//1测试A();//A\testA()$oA=newobjectA();$oA->test();//A\ObjectA//FILE1echoFILE1\CONST_A,PHP_EOL;//2FILE1\testA();//FILE1\testA()$oA=newFILE1\objectA();$oA->test();//FILE1\ObjectA$oB=newobjectB();$oB->test();//FILE1\ObjectA//FILE2echoFILE2\CONST_A,PHP_EOL;//3FILE2\testA();//FILE2\testA()$oA=newFILE2\objectA();$oA->test();//FILE2\ObjectA在测试代码中,我们将当前命名空间定义为A。并包含file1.php和file2.php。并且在此文件中还定义了与file1.php和file2.php中相同的函数和类名。接下来我们依次调用这些静态变量、函数和类。默认情况下,静态变量、函数和类调用当前命名空间下的内容。使用FILE1\和FILE2\后,调用指定命名空间下的内容。使用use导入命名空间,否则不能使用命名空间中的内容可以使用as关键字为命名空间或其中的类指定别名。命名空间的使用其实就这么简单。可以看出,我们可以在不同的命名空间中使用相同的函数或类名。这是各种现代开发框架的基础。同时,这也是composer能够实现的最重要原因之一。接下来我们尝试看一个问题是否符合我们的预期,即定义相同命名空间的两个文件是否可以定义相同的类名?//file1-1.phpnamespaceFILE1;constCONST_A=1.1;functiontestA(){echo'FILE1-1\testA()',PHP_EOL;}classobjectA{functiontest(){echo'FILE1-1\ObjectA',PHP_EOL;}}我们定义了一个file1-1.php并使用了与file1.php相同的FILE1命名空间。然后将其与file1.php一起包含到测试代码中。包括“命名空间/file1.php”;包括“命名空间/file1-1.php”;//CannotredeclareFILE1\testA()那么运行时会直接报错,不能重复定义同名的函数名。如果注释掉函数,会继续报类名不能重复。我们再定义一个file1-2.php,这次还是使用命名空间FILE1,只是内容不一样了。//file1-2.phpnamespaceFILE1;constCONST_A=1.2;functiontestA1_2(){echo'FILE1-2\testA()',PHP_EOL;}classobjectA1_2{functiontest(){echo'FILE1-2\ObjectA',PHP_EOL;}}这当然没问题。这两个文件在同一个命名空间下,但是具有不同的能力,这是一个完全OK的操作。include'namespace/file1.php';include'namespace/file1-2.php';useFILE1;//FILE1echoFILE1\CONST_A,PHP_EOL;//2FILE1\testA();//FILE1\testA()$oA=newFILE1\objectA();$oA->test();//FILE1\ObjectA//FILE1_2echoFILE1\CONST_A,PHP_EOL;//3FILE1\testA1_2();//FILE1-2\testA()$oA=newFILE1\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.phphttps://www.php.net/manual/zh/language.namespaces.definition.php===========各媒体平台你可以搜索【硬核项目经理】
