<转>PHP命名空间的创建和使用

在PHP中,创建一个命名空间十分简单,只需要在文件中所有代码之前声明命名空间,其后所有的类、函数和常量就都处在该命名空间之中。(需要注意的是,只有三种类型的代码受命名空间影响,他们是:类,函数和常量。)

创建一个命名空间:

example1.php:

声明了命名空间的结果,就是Car的实际名字变成了Myspace\Car(当然,你不能直接这么声明)。

当一个外部文件include example1.php的时候,无法直接new Car,因为Car只存在于Myspace这个空间,正确地创建实例的做法是new Myspace\Car。

当在声明了同一个namespace的文件下,new Car相当于new namespace\Car。例如new Car处在example1.php的时候,默认是加上了Myspace\。也就是说,被定义了namespace的文件中的所有非完全限定类名都被默认加上了“namespace\”

但是有一个特例,即array_map。当使用array_map(array(‘Class’,’method’), $input)的时候,即便在声明了namespace的文件中,也不会在Class前面默认添加namespace\,必须使用 array_map(array(‘namespace\Class’,’method’))。

使用命名空间中的类:

example2.php:

就是如此简单。

关于use

在刚使用命名空间的时候,我曾误解过use的用法,以为use起的是类似import的作用。其实use只是用于为命名空间创建别名。

example3.php:

example3.php就是对use一厢情愿的用法,认为use Myspace之后,其后的代码可以一劳永逸地摆脱Myspace的束缚,直接使用Myspace中的类、函数和常量。但是这样的写法只会导致一条Fatal Error:
PHP Fatal error: Class ‘Car’ not found in example4.php…

那有什么办法可以满足这种需求吗?我查了一些资料,在stackoverflow上找到缓解这种需求的做法,那就是利用use为命名空间创建一个简单的别名:

example4.php:

如果确定不会有类名冲突,还可以将use的namespace精确到类名:

example5.php:

PS. use易踩到的一个地雷

写过“use Myspace”而不是“use \Myspace”的同学一定都遇到过这个Warning错误:
Warning: The use statement with non-compound name ‘Myspace’ has no effect in…

这是因为use操作符之后的命名空间名称有一个书写规则:
Note that for namespaced names (fully qualified namespace names containing namespace separator, such as Foo\Bar as opposed to global names that do not, such as FooBar), the leading backslash is unnecessary and not allowed, as import names must be fully qualified, and are not processed relative to the current namespace.

对于包含有命名空间分隔符“\”的“命名空间名称”,首部的反斜杠是不必要的也是不允许的。对于不包含有命名空间分隔符的“全局名称”,首部必须加上反斜杠。

在PHP中,use后跟随的命名空间名称必须是完全限定名称,因此没有必要在首部添加反斜杠,而在“全局名称”前添加反斜杠是给PHP用来确定这是一个完全限定的“命名空间名称”。这个解释来源于stackoverflow上的一个回答“Note that you must use a leading \ here to force the parser into knowing that ReallyLongNSName is fully-qualified”。

举个例子,假如命名空间名称是“Myspace”,那么use的时候应该写成“use \Myspace”;假如命名空间名称是“My\Space”,那么use的时候应该写成“use My\Space”。当然由于use操作符的用法,“use \Myspace”相当于“use \Myspace as Myspace”,是没有什么意义的。具体可以参考PHP手册《使用命名空间:别名/导入》

posted on 2015-10-16 22:49  hahahahahai12  阅读(206)  评论(0)    收藏  举报

导航