您的位置 首页 > 德语词汇

spacebar是什么意思、读音 PHP 命名空间(namespace)

各位老铁们好,相信很多人对spacebar是什么意思、读音都不是特别的了解,因此呢,今天就来为大家分享下关于spacebar是什么意思、读音以及PHP 命名空间(namespace)的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

PHP命名空间(namespace)是在PHP5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。不过在PHP当中还是有着相当重要的意义。

PHP命名空间可以解决以下两类问题:

spacebar是什么意思、读音 PHP 命名空间(namespace)

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;

<?php

你也可以在同一个文件中定义不同的命名空间代码,如:

<?php

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的declare语句。所有非PHP代码包括空白符都不能出现在命名空间的声明之前。

<?php

以下代码会出现语法错误:

<html><?phpnamespaceMyProject;//命名空间前出现了“<html>”会致命错误-命名空间必须是程序脚本的第一条语句?>

子命名空间

与目录和文件的关系很象,PHP命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

<?phpnamespaceMyProject\\Sub\\Level;//声明分层次的单个命名空间constCONNECT_OK=1;classConnection{/*...*/}functionConnect(){/*...*/}?>

上面的例子创建了常量MyProject\\Sub\\Level\\CONNECT_OK,类MyProject\\Sub\\Level\\Connection和函数MyProject\\Sub\\Level\\Connect。

PHP命名空间中的类名可以通过三种方式引用:

非限定名称,或不包含前缀的类名称,例如$a=newfoo();或foo::staticmethod();。如果当前命名空间是currentnamespace,foo将被解析为currentnamespace\\foo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo会被解析为foo。警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

限定名称,或包含前缀的名称,例如$a=newsubnamespace\\foo();或subnamespace\\foo::staticmethod();。如果当前的命名空间是currentnamespace,则foo会被解析为currentnamespace\\subnamespace\\foo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespace\\foo。

完全限定名称,或包含了全局前缀操作符的名称,例如,$a=new\\currentnamespace\\foo();或\\currentnamespace\\foo::staticmethod();。在这种情况下,foo总是被解析为代码中的文字名(literalname)currentnamespace\\foo。

下面是一个使用这三种方式的实例:

<?phpnamespaceFoo\\Bar\\subnamespace;constFOO=1;functionfoo(){}classfoo{

file2.php文件代码

<?phpnamespaceFoo\\Bar;include'file1.php';constFOO=2;functionfoo(){}classfoo{

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如\\strlen()或\\Exception或\\INI_ALL。

在命名空间内部访问全局类、函数和常量:

<?phpnamespaceFoo;functionstrlen(){}constINI_ALL=3;classException{}$a=\\strlen('hi');//调用全局函数strlen$b=\\INI_ALL;//访问全局常量INI_ALL$c=new\\Exception('error');//实例化全局类Exception?>

命名空间和动态语言特征

PHP命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

<?phpclassclassname{

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。

<?phpnamespacenamespacename;classclassname{

namespace关键字和__NAMESPACE__常量

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

__NAMESPACE__示例,在命名空间中的代码

<?phpnamespaceMyProject;echo'"',__NAMESPACE__,'"';//输出"MyProject"?>

__NAMESPACE__示例,全局代码

<?php

常量__NAMESPACE__在动态创建名称时很有用,例如:

<?phpnamespaceMyProject;functionget($classname){

关键字namespace可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的self操作符。

namespace操作符,命名空间中的代码

<?phpnamespaceMyProject;useblah\\blahasmine;//see"Usingnamespaces:importing/aliasing"blah\\mine();//callsfunctionblah\\blah\\mine()namespace\\blah\\mine();//callsfunctionMyProject\\blah\\mine()namespace\\func();//callsfunctionMyProject\\func()namespace\\sub\\func();//callsfunctionMyProject\\sub\\func()namespace\\cname::method();//callsstaticmethod"method"ofclassMyProject\\cname$a=newnamespace\\sub\\cname();//instantiatesobjectofclassMyProject\\sub\\cname$b=namespace\\CONSTANT;//assignsvalueofconstantMyProject\\CONSTANTto$b?>

namespace操作符,全局代码

<?phpnamespace\\func();//callsfunctionfunc()namespace\\sub\\func();//callsfunctionsub\\func()namespace\\cname::method();//callsstaticmethod"method"ofclasscname$a=newnamespace\\sub\\cname();//instantiatesobjectofclasssub\\cname$b=namespace\\CONSTANT;//assignsvalueofconstantCONSTANTto$b?>

使用命名空间:别名/导入

PHP命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。

在PHP中,别名是通过操作符use来实现的.下面是一个使用所有可能的三种导入方式的例子:

<?phpnamespacefoo;useMy\\Full\\ClassnameasAnother;//下面的例子与useMy\\Full\\NSnameasNSname相同useMy\\Full\\NSname;//导入一个全局类use\\ArrayObject;$obj=newnamespace\\Another;//实例化foo\\Another对象$obj=newAnother;//实例化My\\Full\\Classname对象NSname\\subns\\func();//调用函数My\\Full\\NSname\\subns\\func$a=newArrayObject(array(1));//实例化ArrayObject对象//如果不使用"use\\ArrayObject",则实例化一个foo\\ArrayObject对象?>

2、一行中包含多个use语句

<?phpuseMy\\Full\\ClassnameasAnother,My\\Full\\NSname;$obj=newAnother;//实例化My\\Full\\Classname对象NSname\\subns\\func();//调用函数My\\Full\\NSname\\subns\\func?>

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。

<?phpuseMy\\Full\\ClassnameasAnother,My\\Full\\NSname;$obj=newAnother;//实例化一个My\\Full\\Classname对象$a='Another';$obj=new$a;//实际化一个Another对象?>

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

<?phpuseMy\\Full\\ClassnameasAnother,My\\Full\\NSname;$obj=newAnother;//instantiatesobjectofclassMy\\Full\\Classname$obj=new\\Another;//instantiatesobjectofclassAnother$obj=newAnother\\thing;//instantiatesobjectofclassMy\\Full\\Classname\\thing$obj=new\\Another\\thing;//instantiatesobjectofclassAnother\\thing?>

使用命名空间:后备全局函数/常量

在一个命名空间中,当PHP遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:

<?phpnamespaceA\\B\\C;classExceptionextends\\Exception{}$a=newException('hi');//$a是类A\\B\\C\\Exception的一个对象$b=new\\Exception('hi');//$b是类Exception的一个对象$c=newArrayObject;//致命错误,找不到A\\B\\C\\ArrayObject类?>

对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP会退而使用全局空间中的函数或常量。

2、命名空间中后备的全局函数/常量

<?phpnamespaceA\\B\\C;constE_ERROR=45;functionstrlen($str){

全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与PHP引入命名空间概念前一样。在名称前加上前缀\\表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。

<?phpnamespaceA\\B\\C;/*这个函数是A\\B\\C\\fopen*/functionfopen(){

命名空间的顺序

自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。

<?phpnamespaceA;useB\\D,C\\EasF;//函数调用foo();//首先尝试调用定义在命名空间"A"中的函数foo()

名称解析遵循下列规则:

对完全限定名称的函数,类和常量的调用在编译时解析。例如new\\A\\B解析为类A\\B。

所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间A\\B\\C被导入为C,那么对C\\D\\e()的调用就会被转换为A\\B\\C\\D\\e()。

在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间A\\B内部调用C\\D\\e(),则C\\D\\e()会被转换为A\\B\\C\\D\\e()。

非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间A\\B\\C导入为C,则newC()被转换为newA\\B\\C()。

在命名空间内部(例如A\\B),对非限定名称的函数调用是在运行时解析的。例如对函数foo()的调用是这样解析的:

在当前命名空间中查找名为A\\B\\foo()的函数

尝试查找并调用全局(global)空间中的函数foo()。

在命名空间(例如A\\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用newC()及newD\\E()的解析过程:newC()的解析:newD\\E()的解析:为了引用全局命名空间中的全局类,必须使用完全限定名称new\\C()。

在类名称前面加上当前命名空间名称变成:A\\B\\D\\E,然后查找该类。

在当前命名空间中查找A\\B\\C类。

关于spacebar是什么意思、读音,PHP 命名空间(namespace)的介绍到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023