前端学PHP之命名空间

前方的话

  从广义上来说,命名空间是一种包装事物的不二法门。在广大地方都得以见到那种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就饰演了命名空间的角色。那些规律应用到程序设计领域就是命名空间的概念

  在PHP中,命名空间用来化解在编制类库或应用程序时创设可拔取的代码如类或函数时遇见的两类题材:一类是用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字争持;另一类是为很长的标识符名称(经常是为驾驭决第一类题目而定义的)创立一个别名(或简捷)的称谓,进步源代码的可读性。PHP命名空间提供了一种将相关的类、函数和常量组合到一块儿的门路。本文将详细介绍PHP的命名空间

 

定义

  即便任意合法的PHP代码都得以分包在命名空间中,但唯有以下种类的代码受命名空间的震慑,它们是:类(包涵抽象类和traits)、接口、函数和常量

  命名空间通过重点字namespace来声称。若是一个文本中包蕴命名空间,它必须在其余具有代码以前扬言命名空间,除了一个以外:declare关键字

<?php
namespace MyProject;

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

?>

子命名空间

  与目录和文件的涉嫌很象,PHP
命名空间也同意指定层次化的命名空间的称呼。因而,命名空间的名字可以应用分层次的艺术定义

<?php
namespace MyProject\Sub\Level;

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

?>

<?php
    namespace MyProject\Sub\Level;
    const NUM = 1;
    echo NUM;//1
    echo \MyProject\Sub\Level\NUM;//1
?>

 

多命名空间

  能够在同一个文书中定义多少个命名空间。在同一个文书中定义多个命名空间有三种语法格局

  在实际上的编程实践中,格外不提倡在同一个文件中定义三个命名空间。这种格局的重要用以将八个PHP 脚本合并在同一个文本中

【1】简单组合语法(不提出使用)

<?php
namespace MyProject;

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

namespace AnotherProject;

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

【2】大括号语法

<?php
namespace MyProject {

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

namespace AnotherProject {

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

<?php
namespace MyProject {
    const NUM = 1;
}

namespace AnotherProject {
    const NUM = 2;
    echo NUM;//2
    echo \MyProject\NUM;//1
}
?>

全局

  将全局的非命名空间中的代码与命名空间中的代码组合在同步,只可以接纳大括号格局的语法。全局代码必须用一个不带名称的
namespace 语句加上大括号括起来 

<?php
namespace MyProject {

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

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

 

名称解析

  非限定名称Unqualified
name是指名称中不分包命名空间分隔符的标识符,例如 Foo

  限定名称Qualified name是指名称中含有命名空间分隔符的标识符,例如
Foo\Bar

  完全限定名称Fully qualified
name是指名称中富含命名空间分隔符,并以命名空间分隔符开首的标识符,例如
\Foo\Bar。 namespace\Foo 也是一个通通限定名称

  借使要动态访问元素(例如,变量函数),必须利用完全限定名称

<?php
namespace MyProject;
    function test(){
        echo '111';
    }
    $var1 = 'test';
    $var2 = '\MyProject\test';
    $var1();//报错
    $var2();/111
?>

 

做客内部因素

  PHP帮助二种浮泛的访问当前命名空间内部因素的法子,__NAMESPACE__
魔术常量和namespace关键字

  常量__NAMESPACE__的值是带有当前定名空间名称的字符串。在全局的,不包罗在其余命名空间中的代码,它包括一个空的字符串

<?php
namespace MyProject;
    function test(){
        echo '111';
    }
    $var = __NAMESPACE__.'\test';
    $var();//111
?>

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

<?php
namespace MyProject;
    function test(){
        echo '111';
    }
    test();//111
    __NAMESPACE__.test();//111
    namespace\test();//111
?>

 

大局空间

  如若没有概念任何命名空间,所有的类与函数的定义都是在大局空间,与 PHP
引入命名空间概念前一模一样。在名称前加上前缀 \
表示该名称是大局空间中的名称,就算该名称位于其他的命名空间中时也是那般

<?php
namespace A\B\C;
/* 这个函数是 A\B\C\fopen */
function fopen() { 
     /* ... */
     $f = \fopen(...); // 调用全局的fopen函数
     return $f;
} 
?>

 

别名和导入

  php允许通过别名引用或导入外部的完全限定名称,是命名空间的一个根本特征。那有点类似于在类unix文件系统中可以创造对其余的文本或目录的符号连接

  所有接济命名空间的PHP版本帮忙三种别名或导入格局:为类名称使用别名、为接口使用别名或为命名空间名称使用别名

  在PHP中,别名是因此操作符 use 来完成的

别名

<?php
namespace hello\world\test;
use hello\world\test  as  t;//用t来替代hello\world\test
function demo(){
    echo '111';
}
t\demo();//111
?>

  as可以省略

<?php
namespace hello\world\test;
use hello\world\test;//用test来替代hello\world\test
function demo(){
    echo '111';
}
test\demo();//111
?>

导入

<?php
use \ArrayObject;
$a = new ArrayObject([]);//若不使用"use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
?>

  为了简化,一行中得以包括八个use语句

<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

相关文章