《PHP实战:PHP中的命名空间详细介绍》要点:
本文介绍了PHP实战:PHP中的命名空间详细介绍,希望对您有用。如果有疑问,可以联系我们。
概述PHP实例
PHP对于命名空间的支持,经历了一段艰难的旅程.幸运的是,PHP从5.3开始引入了命名空间.自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善.许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了.不管如何,每一种新特性的引入都有其目的,和其他语言一样,PHP引入命名空间也主要是为了办理名字冲突的问题.PHP实例
命名空间(namespace)的概念
PHP实例
之前,开发者必须在类、函数和常量中添加下划线,用来使自己的代码独立其他于代码库.这相当于所有人都给自己的物品贴上标签之后,一起放入了一个更大的抽屉里.尽管这也是一种组织代码的方式,但是这种方式是非常低效的.
命名空间的到来就是为了办理这个问题.我们可以在不同的命名空间里声明相同的函数、类和常量,而不会造成名字上的冲突.本质上,命名空间无非是一种分等级标记PHP代码的方式.PHP实例
正在使用命名空间PHP实例
有一点需要注意的是,我们正在间接的使用命名空间.从PHP 5.3开始,所有在非用户定义的命名空间中的声明(类、函数、常量),都默认的属于全局命名空间.
全局命名空间中包括了所有PHP内部的定义,如echo()、mysqli_connect()和Exception类.由于全局命名空间并没有独立的标识名,所以它经常被成为全局空间(global space).PHP实例
定义命名空间PHP实例
命名空间的定义必需是PHP文件的第一条语句.唯一允许在定义命名空间之前使用的语句是declare语句.
定义命名空间很简单,只需要使用关键字namespace即可.命名空间的名字需要遵循PHP文件中其他标识符的命名规则.
下面是定义一个命名空间的示例:
PHP实例
如果想定义一个属于全局空间的代码块,也是使用namespace关键字,但是后面不加命名空间的名字,如下:
PHP实例
我们也可以将一个命名空间分散在不同的文件中,文件包括的处理程序会自动合并他们.因此,限制大量的命名空间在同一个文件中定义是一个很好的编程实践,就像我们通常单独为每个类定义一个单独的文件一样.
PHP实例
子命名空间PHP实例
命名空间可以遵循一个特定的层级,就像我们电脑文件系统中得目录一样.子命名空间对于将一个项目结构化尤其特别有用.例如,你的项目需要拜访数据库,你可能会想将所有数据库相关的代码(如数据库异常处理等)放在同一个子目录下.PHP实例
为了坚持灵活性,将子命名空间放在子目录中是非常明智的做法.这会使你的代码结构更清晰,而且会使遵循PSR-0标准的autoloaders的使用变得更容易.PHP实例
PHP使用反斜线\作为命名空间的分隔符,有趣的是,PHP甚至考虑过使用笑脸:)作为命名空间的分隔符.PHP实例
子命名空间定义示例:
PHP实例
有一点必要注意的是,PHP并不支持命名空间的嵌套定义,下面的代码会导致一个致命错误:Namespace declarations cannot be nested.
PHP实例
从命名空间中调用代码PHP实例
如果你想在不同的命名空间中实例化一个类、调用一个函数或者使用常量,必要使用反斜线\.他们可以从三个角度被解析:PHP实例
1.未限定的名字
2.限定的名字
3.完全限定的名字PHP实例
未限定的名字(Unqualified Name)PHP实例
这是一个类的名称,函数或常量,但是不包含任何命名的引用.如果命名空间对你来说还比较陌生,那么这就是你熟悉的角度.
PHP实例
限定的名字(Qualified Name)PHP实例
这是我们如何使用子命名空间的方式.示例如下:
PHP实例
完全限定的名字(Fully Qualified Name)PHP实例
前面所说的使用限定的名字和未限定的名字,都是相对于当前所处的命名空间来说的.以上两种方式仅可以被用来拜访当前所处的命名空间和更深层次的子命名空间.PHP实例
如果想拜访一个在比前命名空间更高的层级,那么就需要使用完全限定的名字―一个绝对路径而不是相对路径.这可以归结为在命名空间的最前面加反斜杠\.使用完全限定的名字可以让PHP知道,这次调用是从全局空间开始的,而不是相对于当前所处的命名空间.示例如下:
PHP实例
<?php
namespace MyProject;
var_dump($query); // Overloaded
\var_dump($query); // Internal
// We want to access the global Exception class
// The following will not work because there's no class called Exception in the MyProject\Database namespace and unqualified class names do not have a fallback to global space
// throw new Exception('Query failed!');
// Instead, we use a single backslash to indicate we want to resolve from global space
throw new \Exception('ailed!');
function var_dump() {
echo 'Overloaded global var_dump()!<br />';
}
PHP实例
动态调用
PHP是一门动态语言,也可以将PHP的这种特性用来调用命名空间.这在本质上与实例化一个变量类和包括一个变量文件是相同的.在字符串中,PHP使用的命名空间分隔符(\)也是一个元字符,因此需要转义.
PHP实例
namespace关键字
关键字namespace不仅仅可以用来定义一个命名空间,它也可以用来显示的表示当前命名空间,它此时的作用相当于类中的self关键字.
PHP实例
__NAMESPACE__常量
就像self关键字不能表示当前类的名字一样,namespace关键字也不能用来表示当前命名空间的名字.__NAMESPACE__关键字就是用来办理这个问题的.
PHP实例
导入或别名
PHP中得命名空间也支持导入,导入也被成为别名.只有类、接口和命名空间可以被导入(别名).导入是命名空间中一个非常有用和基础的功能.它使我们可以使用外部的代码包,而不用担心名字的冲突.使用use关键字可以实现导入功能.也可以使用as关键字,在导入的时候指定一个别名.
PHP实例
一个完全限定的名字可以用一个未限定的别名来代替,这样我们就不用在每次使用的时候都使用完全限定的名字,达到简化代码的目的.导入应该在命名空间的最高层或者全局空间中使用,在函数作用域内使用导入功能是非法的语法.
PHP实例
总结PHP实例
命名空间是用来避免定义冲突,并且为代码引入了更加灵活和组织的方式.有一点必要注意的时,我们并没有义务去使用命名空间,它是和面向对象结合使用的一种工作方式.但是,如果使用了命名空间,我们的代码可能会达到一种新的层次,逼格也会显得更高吧.PHP实例
《PHP实战:PHP中的命名空间详细介绍》是否对您有启发,欢迎查看更多与《PHP实战:PHP中的命名空间详细介绍》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/9985.html