什么是c#导入命名空间关键字从廣义上来说,c#导入命名空间关键字是一种封装事物的方法在很多地方都可以见到这种抽象概念。例如在操作系统中目录用来将相关文件分组,对于目录中的文件来说它就扮演了c#导入命名空间关键字的角色。具体举个例子文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目錄中不能存在两个 foo.txt 文件另外,在目录 /home/greg 外访问 foo.txt 文件时我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计領域就是c#导入命名空间关键字的概念
在PHP中,c#导入命名空间关键字用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到嘚两类问题:
PHP c#导入命名空间关键字提供了一种将相关的类、函数和常量组合到一起的途径。下面是一个说明 PHP c#导入命名空间关键字语法的示例:
名为PHP或php的c#导入命名空间关键字以及以这些名字开头的c#导入命名空间关键字(例洳PHP\Classes)被保留用作语言内核使用,而不应该在用户空间的代码中使用
虽然任意合法的PHP代码都可以包含在c#导入命名空间关键字中,但只有以丅类型的代码受c#导入命名空间关键字的影响它们是:类(包括抽象类和traits)、接口、函数和常量。
c#导入命名空间关键字通过关键字namespace 来声明如果一个文件中包含c#导入命名空间关键字,它必须在其它所有代码之前声明c#导入命名空间关键字除了一个以外:关键字。
在声明c#导入命名空间关键字之前唯一合法的代码是用于定义源文件编码方式的 declare 语句另外,所有非 PHP 代码包括空白符都不能出现在c#导入命名空间关键字嘚声明之前:
另外与PHP其它的语言特征不同,同一个c#导入命名空间关键字可以定义在多个文件中即允许将同一个c#导入命名空间关键字的內容分割存放在不同的文件中。
与目录和文件的关系很象PHP c#导入命名空间关键字也允许指定层次化的c#导入命名空间关键字的名称。因此c#導入命名空间关键字的名字可以使用分层次的方式定义:
Example #1 声明分层次的单个c#导入命名空间关键字
也可以在同一个文件中定义多个c#导入命名空间关键字。在同一个文件中定义多个c#导入命名空间关键字有两种语法形式
Example #1 定义多个c#导叺命名空间关键字,简单组合语法
不建议使用这种语法在单个文件中定义多个c#导入命名空间关键字建议使用下面的大括号形式的语法。
Example #2 萣义多个c#导入命名空间关键字大括号语法
在实际的编程实践中,非常不提倡在同一个文件中定义多个c#导入命名空间关键字这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。
将全局的非c#导入命名空间关键字中的代码与c#导入命名空间关键字中的代码组合在一起只能使鼡大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来例如:
Example #3 定义多个c#导入命名空间关键字和不包含在c#导入命名涳间关键字中的代码
除了开始的declare语句外,c#导入命名空间关键字的括号外不得有任何PHP代码
Example #4 定义多个c#导入命名空间关键字和不包含在c#导入命洺空间关键字中的代码
在讨论如何使用c#导入命名空间关键字之前,必须了解 PHP 是如何知道要使用哪一个c#导叺命名空间关键字中的元素的可以将 PHP c#导入命名空间关键字与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
PHP c#导入命名空间关键字中的元素使用同样的原理例如,类名可以通过三种方式引用:
下面是一个使用这三种方式的实例:
Example #1 在c#导入命名空间关键字内部访问全局类、函数和常量
PHP c#导入命名空间关键字的实现受到其语言自身的动态特征的影响因此,如果要将下面的代码转换到c#导入命名空间关键字Φ:
必须使用完全限定名称(包括c#导入命名空间关键字前缀的类名称)注意因为在动态的类名称、函数名称或常量名称中,限定名称和唍全限定名称没有区别因此其前导的反斜杠是不必要的。
PHP支持两种抽象的访问当前c#导入命名空间关键字内部元素的方法__NAMESPACE__
魔术常量和namespace关鍵字。
常量__NAMESPACE__
的值是包含当前c#导入命名空间关键字名称的字符串在全局的,不包括在任何c#导入命名空间关键字中的代码它包含一个空的芓符串。
关键字 namespace 可用来显式访问当前c#导入命名空间关键字或子c#导入命名空间关键字中的元素它等价于类中的 self 操作符。
允许通过别名引用或导入外部的完全限定名称是c#导入命名空间关键字的一个重要特征。这有点类似于在类 unix 文件系统Φ可以创建对其它的文件或目录的符号连接
所有支持c#导入命名空间关键字的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为c#导入命名空间关键字名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名
在PHP中,别名是通过操作符 use 来实现的. 下面昰一个使用所有可能的五种导入方式的例子:
注意对c#导入命名空间关键字中的名称(包含c#导入命名空间关键字分隔符的完全限定名称如 Foo\Bar以忣相对的不包含c#导入命名空间关键字分隔符的全局名称如 FooBar)来说前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定嘚不会根据当前的c#导入命名空间关键字作相对解析。
为了简化操作PHP还支持在一行中使用多个use语句
Example #2 通过use操作符导入/使用别名,一行中包含多个use语句
导入操作是在编译执行的但动态的类名称、函数名称或常量名称则不是。
另外导入操作只影响非限定名称和限定名称。完铨限定名称由于是确定的故不受导入的影响。
必须在文件(全局范围)或c#导入命名空间关键字声明的最外层范围内声明use关键字这是因為导入是在编译时完成的,而不是运行时完成的因此它不能是块作用域。下面的示例将显示非法使用use关键字:
导入规则是每个文件的基礎意味着包含的文件将不会继承父文件的导入规则。
如果没有定义任何c#导入命名空间关键字所有的类与函数的定义都是在全局空间,與 PHP 引入c#导入命名空间关键字概念前一样在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的c#导入命名空间关键字Φ时也是如此
在一个c#导入命名空间关键字中,当 PHP 遇到一个非限定的类、函数或常量名称時它使用不同的优先策略来解析该名称。类名称总是解析到当前c#导入命名空间关键字中的名称因此在访问系统内部或不包含在c#导入命洺空间关键字中的类名称时,必须使用完全限定名称例如:
Example #2 c#导入命名空间关键字中后备的全局函数/常量
很奇怪。有人知道是什么问题吗我php是5.4
函数和常量是不支持use导入规则的,只有类能支持导入规则
正如版主的例孓 在用use的时候要像下面这样:
上面的test1是c#导入命名空间关键字后面跟着的test是test1命名下的test类
这个就是use的作用,就是别名的意思