PHP面向对象编程(OOP)学习笔记(五)-PHP名称空间

PHP面向对象编程(OOP)学习笔记(五)-PHP名称空间
命名空间概述

在PHP中,名称空间用于解决在编写类库或应用程序创建可重用代码(如类或函数)遇到的两类问题:

用户编写的代码与PHP中的类/函数常量或第三方类/函数常数的名称相冲突。
为长标识符名称创建别名(或简称)名称,通常用来减轻第一类问题,并提高源代码的可读性。
PHP名称空间提供了一种将相关的类、函数和常量组合在一起的方法

定义命名空间

尽管任何合法PHP代码都可以包含在名称空间中,但只有三种类型的代码受名称空间的影响。他们是类、函数和常量。命名空间的命名空间中声明的关键字。如果一个文件包含一个命名空间,它必须在任何其他代码的命名空间声明。另外,不像其他的PHP语言的特点,同一命名空间可以在多个文件中,这样的定义,同一命名空间的内容是允许的将分区和存储在不同的文件。当然,你也可以在同一文件中定义多个命名空间。

复制代码代码如下所示:
Namespace MyProject;

{
#代码…
}
定义:与subnamespace目录和文件的关系是非常相似的,与PHP的命名空间允许指定层次命名空间的名称。因此,命名空间的名字可以定义在一个分层的方式。

复制代码代码如下所示:
命名空间如何 HTTP帮手;

{
#代码…
}
在同一个文件的多个命名空间定义:两种方式在同一个文件的多个命名空间的声明,但在实际编程实践,不提倡总督命名空间定义在同一文件中。这种方法主要用于合并多个PHP脚本在同一个文件。第一种方法如下。

复制代码代码如下所示:
命名空间如何 HTTP帮手;

{
#代码…
}
命名空间如何 请求帮助;

{
#代码…
}
但是,强烈建议不要使用此方法,您可以参考下面的括号定义:

复制代码代码如下所示:
命名空间如何 HTTP帮手;
{

{
#代码…
}
}
命名空间如何 请求帮助;
{

{
#代码…
}
}
在PHP名称空间中使用元素

在讨论如何使用名称空间之前,您必须了解PHP如何知道名称空间中使用的元素。类名可以用三种方式引用:

不合格,或类名称不包含前缀,如美元=新foo();或foo::静态方法();如果当前命名空间是currentnamespace,foo将解析为currentnamespace foo.if使用foo的代码是全球性的,不以任何命名空间包含代码,foo将解析为foo。警告:如果命名空间中的函数或常量是没有定义的,无限制的函数名或常量名称将作为全局函数名或常量名称解决。详情见使用命名空间:备份全局函数名称 /常数名称。

定义的名字,或包含前缀的名称,如美元=新subnamespace foo();或subnamespace foo::静态方法();如果当前命名空间是currentnamespace,然后foo将解析为currentnamespace subnamespace foo.if使用foo的代码是全球性的,并不在任何命名空间包含代码,foo将解析为subnamespace Foo。

完全合格的名称或名称的全局前缀运算符,例如,$ =新 currentnamespace foo();或 currentnamespace foo::静态方法();在这种情况下,富总是解析为词名(名称)currentnamespace foo中的代码。
使用名称空间:别名/导入

命名空间的一个重要特性是允许通过别名引用或导入外部完全限定名称。PHP名称空间支持使用别名或导入方式的两种方式:使用类名别名,或使用名称空间名称别名。

注意,PHP不支持导入函数或常量。

复制代码代码如下所示:
命名空间Foo;
用我的 类名作为另一个全;

下面的示例使用我的全 nsname / nsname
用我全部nsname ;

进入全局类
使用数组对象;
名称解析规则

在解释名称解析规则之前,让我们看看一些重要的定义:

不合格的不合格的名称:标识符不包含命名空间分隔符的名字,比如foo
名称限定名称:包含名称中的命名空间分隔符的标识符,例如
完全限定名:完全限定名:名称包含命名空间分隔符和以名称空间分隔符开头的标识符,例如:。
名称解析遵循以下规则:

完全定义的名称、类的调用和常量的函数在编译时被解析。
所有不合格名称和限定名称(非完全限定名称)根据当前导入规则在编译时进行转换。例如,如果将名称空间导入到C,则对C(e)的调用将转换为。
在名称空间内,根据导入规则转换的所有限定名称都添加到当前名称空间的名称中。
不合格类名在编译时根据当前导入规则进行转换(使用全名而不是简短的导入名称)。例如,如果将名称空间中的C导入到C中,则将新的C()转换为新的。
在名称空间内(例如, b),在运行时解析对非限定名称的函数调用。
1)在当前名称空间中查找名为()的函数。
2)尝试在全局(全局)空间中查找和调用函数富()。
在名称空间(例如, b)中,对不合格名称或有限名称类(非完全限定名称)的调用在运行时进行解析:
在当前命名空间中找到一个类。
试着自动加载类。

新版本的解析(e):
将当前名称空间的名称添加到类名中,然后查找类。
试着自动加载类。

为了引用全局命名空间中的全局类,必须使用完全限定名的新C()。

示例名称解析示例

复制代码代码如下所示:
< PHP
命名空间;
使用B、C、E作为f;
函数调用
(富);第一次尝试调用命名空间中定义的
尝试调用全局函数
();调用全局空间函数
(我的);在名称空间函数中定义了调用。
(f);第一个调用在名称空间函数f中定义。
尝试调用全局函数f
类引用
新建(b);在类中定义一个名称空间对象A
如果未找到,则尝试自动加载类
新建(d);使用导入规则,创建一个对象命名空间
如果没有找到,则尝试自动加载类
新建(f);使用导入规则,创建一个对象名称空间类E
如果没有找到,则尝试自动加载类
新建();在类中创建全局空间中定义的对象
如果没有找到,则尝试自动加载类B
新建();在类中创建全局空间中定义的对象。
如果未找到,则尝试自动加载类d
新建();在类中创建全局空间中定义的对象
如果未找到,则尝试自动加载类
静态方法调用另一命名空间名称空间或函数。
(b);调用命名空间函数
B(:);调用名称空间类B和 方法
如果没有找到类,请尝试自动加载类
D:(:);使用导入规则,调用名称空间B类D和方法
如果未找到类b,则尝试自动加载类
();在中调用名称空间B函数
:(富);调用类中的全局空间和方法
如果未找到类b,则尝试自动加载类B
名称空间或函数中的当前静态方法
答:(:);调用名称空间类B和 方法
如果没有找到类,请尝试自动加载类
:(;);调用名称空间类B和 方法
如果没有找到类,请尝试自动加载类
>
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部