-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PHP高级OOP特性 #11
Comments
PHP命名空间什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。 PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。 PHP 命名空间可以解决以下两类问题:
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。接下来,我们一起来看看 PHP 命名空间的相关知识! 定义命名空间默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。 命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;
你也可以在同一个文件中定义不同的命名空间代码,如:
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
子命名空间与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
命名空间使用PHP 命名空间中的类名可以通过三种方式引用:
命名空间和动态语言特征PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。
必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。 动态访问命名空间的元素
namespace关键字和__NAMESPACE__常量PHP支持两种抽象的访问当前命名空间内部元素的方法,NAMESPACE 魔术常量和namespace关键字。 常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。 关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。 namespace操作符,命名空间中的代码:
使用命名空间:别名/导入PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。 在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子: 1、使用use操作符导入/使用别名
2、 一行中包含多个use语句
3、导入和动态名称
4、导入和完全限定名称
使用命名空间:后备全局函数/常量在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称 1、在命名空间中访问全局类: 对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。 2、 命名空间中后备的全局函数/常量 全局空间如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
命名空间的顺序自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。
名称解析遵循下列规则:
a. 在当前命名空间中查找名为 A\B\foo() 的函数 b. 尝试查找并调用 全局(global) 空间中的函数 foo()。
a. 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。 b. 尝试自动装载类 A\B\D\E。 c. 在当前命名空间中查找A\B\C类。 d. 尝试自动装载类A\B\C。 |
No description provided.
The text was updated successfully, but these errors were encountered: