面向对象的命名空间总结

来源:互联网 发布:don t starve for mac 编辑:程序博客网 时间:2024/06/06 03:28
一.命名空间的概述
命名空间:从广义上来说:命名空间是一种封装事物的方法,在很多地方都可以见到这种抽象概念
PHP5.3.0以后引入命名空间概念
二.定义命名空间
PHP虽然任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响
分别是:类、函数和常量
命名空间通过关键字namespace来声明,如果一个文件中包含命名空间,他必须在其他所有代码
之前声明命名空间
例:
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
?>
三.定义子命名空间
与目录和文件的关系很像,PHP命名空间也允许指定层次化的命名空间的名称
因此,命名空间的名字可以使用分层次的方式定义


四.在同一个文件中定义多个命名空间
可以在同一个文件中定义多个命名空间,在同一个文件中定义多个命名空间有两种语法形式
在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间
例:
      <?php
            namespace MyProject {
… …
            }
            namespace AnotherProject {
... …
            }




            //不包含在命名空间中的代码
            namespace { // 全局代码
... ...
            }
        ?>
    大括号外不能有任何PHP代码


五.使用命名空间
可以将PHP命名空间与文件系统作一个简单的类比。在文件中访问一个文件的三种方式:
相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。
相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。
绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt
PHP命名相同空间中的元素使用相同的原理
非限定名称(不包含前缀的名称)
$obj=new Test();
限定名称(包含相对前缀的名称);
$obj=new php\Test();
完全限制名称(包含了全局前缀名称)
$obj=new \yhit\php\Test();


六.命名空间的实现受到其语言自身的动态特征的影响,因此,如果要将下面的代码转换到
命名空间中必须使用完全限定名称
namespace yhit;
const HOST="127.0.0.1";
function one(){
    echo "This is one .<br>";
}
$test='\yhit\one';
$test();
echo constant('\yhit\HOST');


七.namespace关键字和__NAMESPACE__常量
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术变量
和namespace关键字
常量__NAMESPACE__的值是包含当前命名空间名称的字符串,在全局的,不包含在任何命名
空间中的代码,它包含一个空的字符串
关键字namespace可用来显示访问当前命名空间或子命名空间中的元素,他等价于类中的
self操作符


八.使用命名空间:别名/导入
别名(命名空间起别名)
namespace yhit\php;
use yhit\php as yhdata;
use yhit\php;
导入(导入类)
use \Teacher;
$teacher=new Teacher();
$teacher->getMoney();


九.全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。
在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此
      namespace yhit\php;


function print_r($v){
    echo "<pre>";
    \print_r($v);
    echo "</pre>";
}


     print_r($_SERVER);


十.使用命名空间:后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。
类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称.
对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。