php专区

 首页 > php专区 > PHP基础 > 简介 > 个人对命名空间的一点理解

个人对命名空间的一点理解

分享到:
【字体:

比如说,一个类名是UserInformationCenter,假如命名空间在 AppController,那么使用时,要写 AppControllerUserInformationCenter ,不利于可读性,因此可以加一个简短的别名,AppControllerUserInformationCenter as UIC;
# 使用示例namespace myname; //声明一个命名空间,下面的代码属于这个命名空间内class MyClass {} //实际 : mynameMyclass{}function myfunction() {} // mynamemyfunction()const MYCOnST= 1; // mynameMYCONST$a = new MyClass; //实例化的类是 mynameMyclass{}$b = new mynameMyClass; //object(mynameMyClass)#2 (0) {}$c = strlen('hi');    //全局空间下,前面省略了 $d = namespaceMYCONST;        //namespace关键字获取的就是当前的命名空间名称$e = __NAMESPACE__ . "MYCONST";echo "
";var_dump($a, $b, $c ,$d ,$e);echo constant($e);/*object(mynameMyClass)#1 (0) {
}
object(mynameMyClass)#2 (0) {
}
int(2)
int(1)
string(15) "mynameMYCONST"
1
*/

注意:名为PHP或php的命名空间,以及以这些名字开头的命名空间(例如PHPClasses)被保留用作语言内核使用,而不应该在用户空间的代码中使用。

定义命名空间

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }

定义子命名空间

namespace MyProjectSubLevel;const CONNECT_OK = 1;    //MyProjectSubLevelCONNECT_OKclass Connection { /* ... */ }        //MyProjectSubLevelConnectionfunction connect() { /* ... */  }    //MyProjectSubLevelconnect

在同一个文件中定义多个命名空间

  1. 写法1
namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }namespace AnotherProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }
  1. 写法2
namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}

使用命名空间

  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo();foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称
  2. 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo();subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo
  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo();currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo

下面是示例:

# file1.php# file2.php

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

命名空间和动态语言特征

example1.php:

namespace关键字和NAMESPACE常量

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

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

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

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

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

为类名称使用别名,为接口使用别名,为命名空间名称使用别名,别名是通过操作符 use 来实现的

想了解更多编程学习,敬请关注php培训栏目!

以上就是个人对命名空间的一点理解的详细内容,更多请关注 第一PHP社区 其它相关文章!


分享到:
没有了!
论PHP接口版本控制【兼容多端接口】
首先在控制器入口层写一个基类控制器,后续所有的控制器都将会继承该类,在构造函数中调取行为类中的解析服务层代码,将服务层类初始化给基类变量! public $service = null; /** * 构造函数处理头部请求 * * @return void */ public function __construct($type = 0, Request $request) ...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……