当前位置: 首页 > 后端技术 > PHP

命名空间在PHP中是如何存在的?(2)今天带来的

时间:2023-03-29 15:04:07 PHP

还是和命名空间有关的,而命名空间本身就是PHP中一个非常重要的特性。因此,它的各种操作和使用还是很复杂的,使用方法也有很多种。让我们一一看看。子命名空间命名空间本身就像一个目录,所以命名空间当然也可以定义一个子命名空间,这与操作系统的各个目录级别完全相同。让我们看一个简单的例子。首先创建三个php文件,其中3-2和3-2-1使用的是同一个二级命名空间,3-2-1在FILE32的基础上继续扩展三级命名空间FILE321。它们都是MyProject命名空间的子命名空间。//file3-1.phpnamespaceMyProject\FILE31;functiontestA31(){echo'FILE31\testA()',PHP_EOL;}//file3-2.phpnamespaceMyProject\FILE32;constCONST_A32="file3-2";functiontestA32(){echo'FILE32\testA()',PHP_EOL;}classobjectA32{functiontest(){echo'FILE32\ObjectA',PHP_EOL;}}//file3-2-1.phpnamespaceMyProject\FILE32\FILE321;functiontestA321(){echo'FILE321\testA()',PHP_EOL;}接下来的使用就很简单了,和使用一级命名空间一样,只需使用直接导入即可。//subnamespacerequire'namespace/file3-1.php';require'namespace/file3-2.php';require'namespace/file3-2-1.php';useMyProject\FILE31;useMyProject\FILE32;使用MyProject\FILE32\FILE321;FILE31\testA31();//FILE31\testA()FILE32\testA32();//FILE32\testA()FILE32\FILE321\testA321();//FILE321\testA()FILE321\testA321();//FILE321\testA()在同一个文件中定义多个命名空间PHP允许在一个文件中定义多个命名空间,但是不推荐这样做,因为它可能会带来各种未知数的混淆。在这里,我们只需要了解可以这样使用,在日常开发中尽量避免。//file4.phpnamespaceFILE41;functiontestA41(){echo'FILE41\testA()',PHP_EOL;}namespaceFILE42;functiontestA42(){echo'FILE42\testA()',PHP_EOL;}当然它也适用于其他命名空间的使用无异,直接使用即可。//文件中的多个命名空间需要'namespace/file4.php';useFILE41,FILE42;FILE41\testA41();//FILE41\testA()FILE42\testA42();//FILE42\testA()isnotQualifiedname,qualifiedname,fullyqualifiedname不要被术语吓倒,这三个术语其实很容易理解。非限定名称,名称不包含名称空间分隔符的标识符,例如Foo。限定名称,名称中带有名称空间分隔符的标识符,例如Foo\Bar。名称包含命名空间分隔符并以其开头的标识符,例如\Foo\Bar。namespace\Foo也是一个完全限定的名称。举个例子就很清楚了。//非限定名、限定名、完全限定名useMyProject\FILE32\objectA32asobj32;$o=newobj32();//非限定名称$o->test();//FILE32\ObjectA$o=newFILE32\objectA32();//限定名$o->test();//FILE32\ObjectA$o=new\MyProject\FILE32\objectA32();//完全限定名$o->test();//FILE32\ObjectAnamespace关键字和__NAMESPACE__常量命名空间,显式访问当前命名空间或子命名空间中的元素。它相当于类中的self运算符。__NAMESPACE__,一个包含当前命名空间名称的字符串。在全局代码中,不包含在任何名称空间中,它包含一个空字符串。也很简单,直接看例子吧。//file5.phpnamespaceFILE5;functiontest(){echo__NAMESPACE__.':test()',PHP_EOL;}//test.phpnamespacePro;//命名空间和__NAMESPACE__需要'namespace/file5.php';functiontest(){echo__NAMESPACE__.':test()',PHP_EOL;}namespace\test();//专业版:测试()\FILE5\测试();//FILE5:test()我们定义当前命名空间为Pro,引入了file5文件。两个文件中都有一个test()方法,在test()方法中输出__NAMESPACE__来打印当前命名空间名称。然后在test.php中,通过namespace关键字调用当前文件Pro命名空间中的test()方法,输出为Pro:test()。使用完全限定名称直接调用FILE5的test()方法输出FILE5:test()。测试代码: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%BA%8C%EF%BC%89%20.php参考文档:https://www.php.net/manual/zh/language.namespaces.nsconstants.phphttps://www.php.net/manual/zh/language.namespaces.rules.phphttps://www.php.net/manual/zh/language.namespaces.nested.phphttps://www.php.net/manual/zh/language.namespaces.definitionmultiple.php可被各媒体平台搜索【硬核项目经理】