小白教程

 找回密码
 立即注册
小白教程 首页 系列教程 PHP系列教程 查看内容

PHP 命名空间

发布者: 小白教程



命名空间和动态语言特征

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

example1.php 文件代码:

  1. <?php
  2. class classname
  3. {
  4. function __construct()
  5. {
  6. echo __METHOD__,"\n";
  7. }
  8. }
  9. function funcname()
  10. {
  11. echo __FUNCTION__,"\n";
  12. }
  13. const constname = "global";
  14. $a = 'classname';
  15. $obj = new $a; // prints classname::__construct
  16. $b = 'funcname';
  17. $b(); // prints funcname
  18. echo constant('constname'), "\n"; // prints global
  19. ?>

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

动态访问命名空间的元素

  1. <?php
  2. namespace namespacename;
  3. class classname
  4. {
  5. function __construct()
  6. {
  7. echo __METHOD__,"\n";
  8. }
  9. }
  10. function funcname()
  11. {
  12. echo __FUNCTION__,"\n";
  13. }
  14. const constname = "namespaced";
  15. include 'example1.php';
  16. $a = 'classname';
  17. $obj = new $a; // prints classname::__construct
  18. $b = 'funcname';
  19. $b(); // prints funcname
  20. echo constant('constname'), "\n"; // prints global
  21. /* note that if using double quotes, "\\namespacename\\classname" must be used */
  22. $a = '\namespacename\classname';
  23. $obj = new $a; // prints namespacename\classname::__construct
  24. $a = 'namespacename\classname';
  25. $obj = new $a; // also prints namespacename\classname::__construct
  26. $b = 'namespacename\funcname';
  27. $b(); // prints namespacename\funcname
  28. $b = '\namespacename\funcname';
  29. $b(); // also prints namespacename\funcname
  30. echo constant('\namespacename\constname'), "\n"; // prints namespaced
  31. echo constant('namespacename\constname'), "\n"; // also prints namespaced
  32. ?>

namespace关键字和__NAMESPACE__常量

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

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

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

  1. <?php
  2. namespace MyProject;
  3. echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
  4. ?>

__NAMESPACE__ 示例,全局代码

  1. <?php
  2. echo '"', __NAMESPACE__, '"'; // 输出 ""
  3. ?>

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

使用 __NAMESPACE__ 动态创建名称

  1. <?php
  2. namespace MyProject;
  3. function get($classname)
  4. {
  5. $a = __NAMESPACE__ . '\\' . $classname;
  6. return new $a;
  7. }
  8. ?>

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

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

  1. <?php
  2. namespace MyProject;
  3. use blah\blah as mine; // see "Using namespaces: importing/aliasing"
  4. blah\mine(); // calls function blah\blah\mine()
  5. namespace\blah\mine(); // calls function MyProject\blah\mine()
  6. namespace\func(); // calls function MyProject\func()
  7. namespace\sub\func(); // calls function MyProject\sub\func()
  8. namespace\cname::method(); // calls static method "method" of class MyProject\cname
  9. $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
  10. $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
  11. ?>

namespace 操作符, 全局代码

  1. <?php
  2. namespace\func(); // calls function func()
  3. namespace\sub\func(); // calls function sub\func()
  4. namespace\cname::method(); // calls static method "method" of class cname
  5. $a = new namespace\sub\cname(); // instantiates object of class sub\cname
  6. $b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
  7. ?>


上一篇:PHP 魔术常量下一篇:PHP 面向对象

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 01:42 , Processed in 0.016273 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部