PHP关键特性之命名空间实例详解_php实例_脚本之家

Fully-qualified name

引用命名空间标识符的三种方式

类似于操作系统上的相对路径,它包含部分名字并被引用到当前的命名空间。

比如 BC() 在命名空间 A 下调用,则最终引用的命名空间就是
ABCUnqualified name

类似于Qualified name,但是没包括子命名空间。

namespace Example;require_once "fnction.php";class ClassA {}function Function() {}//完全限定名称ExampleFunction();ExampleBFunction; //指向 ExampleBFunction();//非限定名称$test = new ClassA(); //resolves to ExampleClassAFunction(); //指向 ExampleFunction

先举个简单的例子,首先编写一段代码,命名为 function.php :

举个例子如何使用 use 关键字,该代码处于全局命名空间之下:

命名空间主要是为了解决代码中类和函数可能存在冲突的问题,而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出现催生了
PSR-4 的诞生,从而也催生了 Composer 的兴起,所以是非常重要的特性。

类似于操作系统上的绝对路径,而且是完整的路径,所以在理解的时候不会有误解。

•通过 use 关键字可以导入常量、函数、类、接口、其他命名空间。

假如要使用的命名空间层级很长且数量很多,那么在使用的时候特别麻烦,所以可以使用
use
关键字导入命名空间、类、常量、函数等,然后可以使用它们直接引用完整的名称。而
alias 关键字可以给导入的类和函数等重命名。

对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP
文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间。

假如编写的代码没有定义命名空间,那说明它属于全局的命名空间,所以能够直接引用类或者函数。

以上所述是小编给大家介绍的PHP关键特性之命名空间实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

比如 C() 在命名空间 AB 下调用,则最终引用的命名空间就是 ABC()。

比如在 new ABC ,那么 C 就被会解析到 AB 命名空间下的 C 类。

总结:

•Inside a namespace,假如在 current scope 没有发现函数和常量的定义,PHP
不会报错。而是去全局命名空间中寻找。

namespace secondsp;include 'function.php';class foo{ function foofunction() { return __METHOD__ . "rn" ; }}function is_file{ return true ;}//非限定名称:实例化secondspfoo类对象$obj = new foo; echo $obj->foofunction();//实例化FooBarsubnamespacefoo 类对象$obj = new FooBarsubnamespacefoo ;echo $obj->foofunction();//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错//$obj = new ArrayObject; $obj = new ArrayObject; //在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native functionecho strlen; //引用当前命名空间下的函数var_dump; //True//引用全局函数var_dump; //False

命名空间的定义

注意:

•PHP
中作用域的概念很弱化,全局域和局部域分的很清楚,比如在函数或类中无法引用全局空间中的变量。而在命名空间则不同,定义命名空间的代码,假如找不到对应命名空间下的常量和函数,则会使用全局的常量和函数;而假如找不到对应名命名空间下的类,则代码直接报错。

include 'function.php';use FooBarsubnamespacefoo ;$obj = new foo;echo $obj->foofunction();use FooBarsubnamespacefoo as aliasfunname;$obj = new aliasfunname;echo $obj->foofunction();use FooBarsubnamespace ; $obj = new subnamespacefoo ;echo $obj->foofunction();use FooBarsubnamespace as aliasname;$obj = new aliasnamefoo ;echo $obj->foofunction();//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用$obj = new ArrayObject; //导入一个函数use function FooBarsubnamespacefoo ;echo foo();use function FooBarsubnamespacefoo as func;echo func();use const FooBarsubnamespaceFOO;//echo FOO;

导入,别名

•Inside a namespace,假如在 current scope 没有发现类的定义,则 PHP
会直接报错,不会去全局域中找对应的类,所以假如你需要引用一个 internal
或用户自定义的类,必须使用完全限定名称。

namespace FooBarsubnamespace;const FOO = 1;function foo() { return "foorn";}class foo { static function staticmethod() { return __METHOD__ . "rn" ; } function foofunction() { return __METHOD__ . "rn" ; }}

命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行。

通过一个例子来说明三种引用方式:

•和 Python 不一样,PHP
中的命名空间是语义上的一种概念,和具体代码的位置、布局没有关系,换句话说,使用命名空间的代码需要自己引入库文件,至于库文件如何组织无所谓;而在
Python 中,假如模块或包中有一个 __init__.py 文件,则 Python
解析器会自动引入包或所有模块的文件。

•通过 use 关键字使用命名空间的,无须通过完全限定名称的方式导入,因为 PHP
已经假设导入的是完全限定的命名空间。

•命名空间是一种语言特性,为了追求更有效的使用,应该有一种使用规范和自动加载机制,这就是
PSR-4 规范。

Qualified name

再编写一段代码 test.php,也是处于命名空间之下的代码:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图