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 ?>
时间: 2024-10-01 04:56:46

PHP之命名空间的相关文章

命名空间

1.命名空间,即将代码划分成不同空间,不同空间的类名相互独立,互不冲突.一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码.内容空间声明后的代码便属于这个命名空间,例如: <?php echo 111; //由于namespace前有代码而报错 namespace Teacher; class Person{ function __construct(){ echo 'Please study!'; } } 2.调用不同空间内类或方法需写明命名空间.例如: <?php nam

PHP命名空间

命名空间 namespace命名空间 1. 什么是命名空间 在php程序语言里边,语法规则要求同名称的函数.类名.常量在一个请求里边不允许出现多次.如果有的应用程序(例如tp框架中有smarty.视频方法插件,他们有同名称的多个元素)不得已必须出现多个同名的 函数.类名.常量,那么我们就可以把它们放到不同的空间里边做请求.这个不同的空间就称作“命名空间”. 2. 使用命名空间 通过namespace关键字声明命名空间. namespace  空间名称; (空间名称 按照php正确的命名方式定义即

五:理解控件的运行机制(例:基于Control命名空间的简单控件)

一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写 2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 System.Web.UI.WebControls.WebControl继承自Control支持控件外观 System.Web.UI.WebControls.CompositeControl继承自WebControl类派生出多个控件合成的复合控件 3.控件树的实现原理首先Page类本身就是一个控件,它继

PHP命名空间规则解析及高级功能

日前发布的PHP 5.3中,最重要的一个新特性就是命名空间的加入.本文介绍了PHP命名空间的一些术语,其解析规则,以及一些高级功能的应用,希望能够帮助读者在项目中真正使用命名空间. 在这里中我们介绍了PHP命名空间的用途和namespace关键字,在这篇文章中我们将介绍一下use命令的使用以及PHP如何解析命名空间的名字的. 为了便于对比,我定义了两个几乎一样的代码块,只有命名空间的名字不同. < ?php // application library 1 namespace App\Lib1;

spring命名空间p装配属性

使用<property>元素为bean的属性装备值和引用并不太复杂.尽管如此,spring的命名空间p提供了另一种bean属性的装配方式. 命名空间p的schema url是:http://www.springframework.org/schema/p 直接看例子(还是角色跟用户的model): public class Roles { private int id; private String roleName; private Users users; //省略set get方法 //

JS命名空间模式解析

简介 在SF上看到这样一个提问: 如题,因为不得已的原因,需要写若干个全局函数.但又不想这样: window.a = function(){} window.b = function(){} window.c = function(){} 题主问有什么好的写法? 解答: 如果你用 jQuery,你可以这样写 $.extend(window, { a: function() {}, b: function() {}, c: function() {} }); 如果你不用 jQuery,可以直接实现

Django中url使用命名空间的错误

出的错误: 1. Reverse for 'llist' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 2. Reverse for 'home' with arguments '(1L,)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'org/home/?P<org_id>(/d+)/$'] 出错原因

python开发函数进阶:命名空间,作用域,函数的本质,闭包,内置方法(globales)

一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 硬盘上--内存里#内置-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载) 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #全局命名空间 5 a = 5 6 b = 8 7 #局部命名空间(函数) 8 def my_max(): 9 c = a if a > b else b 10 return c 11 m = my_max() 12 pr

C#中的程序集和命名空间

C#中的程序集和命名空间 如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式.只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型.<精通.NET核心技术--原理与架构> 程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集. 程序集是应用程序的部署单元..NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL 的.NET可执行程序称为程序集..NET程序集包含元数据,这些元数据描述了程序集中定义的所有

面向对象(一)封装 命名空间 访问修饰符等

一.封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部借口,以特定的访问权限来使用类的成员. public class 类名 { //成员变量 private 数据类型 _属性名; //属性 public 数据类型 属