PHP 5.3 及以上版本中引入了命名空间 的概念。

notes:

1. 在 PHP 中,命名空间用来解决在编写 类库应用程序 时创建 可重用 的 代码如 函数 时碰到的两类问题

① 用户编写的代码与 PHP 内部的 类 / 函数 / 常量 或 第三方类 / 函数 / 常量 之间的名字冲突;

② 为很长的标识符名称 ( 通常是为了缓解第一类问题而定义的 ) 创建一个别名(或简短)的名称,提高源代码的可读性。

2. 如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间

【例1】同目录下的两个 php 文件

file 1:Member.php

<?php
namespace member; class Member {
public $name;
}

file 2:test.php

<?php
namespace test;
include 'Member.php'; $res = new \member\Member(); var_dump($res);

引用 Member 类时需要使用 命名空间运算符(namespace operater,就是类前面的那个反斜杠),PHP 将从命名空间栈的顶部开始查找类。

要引用 Member 类,需要知道当前文件在哪一个命名空间中,如:

a. 在 member 命名空间中,Member 类称为 Member

b. 在 全局命名空间 中,称为 member/Member

c. 在 其他命名空间中,称为 \member\Member

执行 test.php,输出:

object(member\Member)[1]
public 'name' => null

3. 定义子命名空间

与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。

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

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

所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6 开始允许导入函数或常量或者为它们设置别名。

【例2】

file 1:Member.php

<?php
namespace MyProject\member; class Member {
public $name;
public static function getName(){
return 'my name is dee';
}
}

file 2: test.php

<?php
namespace test;
use MyProject\member;
include 'Member.php'; echo member\Member::getName();

<?php
namespace test;
use MyProject\member as m;
include 'Member.php'; echo m\Member::getName();

输出:my name is dee

至于在框架中没有使用 include 函数 是由于使用了 __autoload 函数自动加载文件,但是该函数只能在 非命名控件下 定义,也就是 全局 情况下:

Member.php

<?php

class Member {
public $name;
public static function getName(){
return 'my name is dee';
}
}

test.php

<?php

function __autoload($classname){
include $classname.'.php';
} echo Member::getName();

如果在已经有了 命名空间 的类中,可以使用函数 spl_auto_register 来注册一个类中的方法来代替 __autoload 函数(参见 http://blog.csdn.net/sky_zhe/article/details/38523145)。

5. 可以通过 __NAMESPACE__ 查看当前明明空间:

<?php
namespace test; function testNamespace(){
return __NAMESPACE__;
} echo testNamespace();

输出:test

附:TP 3.2 手册中关于命名空间

参考:

http://www.php.net/manual/zh/language.namespaces.php

http://www.oschina.net/question/147332_138188

http://higrid.net/hi/docs/php-namespace-and-autoload

http://php.net/manual/zh/function.spl-autoload-register.php

PHP 命名空间总结的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(3):命名空间

    在上一篇文章中,老周介绍了表达式和语句,尽管老周没有把所有的内容都讲一遍,但相信大伙至少已经掌握基本用法.在本文中,咱们继续探讨 CodeDom 方面的奥秘,这一次咱们聊聊命名空间. 在开始之前,老周 ...

  2. C++中的命名空间

    一,命名空间(namespace)的基本概念以及由来 1.什么是标识符: 在C++中,标识符可以是基本的变量,类,对象,结构体,函数,枚举,宏等. 2.什么是命名空间: 所谓的命名空间是指标识符的可见 ...

  3. PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则

    PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...

  4. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

  5. .Net 序列化(去除默认命名空间,添加编码)

    1.序列化注意事项 (1).Net 序列化是基于对象的.所以只有实例字段呗序列化.静态字段不在序列化之中. (2)枚举永远是可序列化的. 2.XML序列化时去除默认命名空间xmlns:xsd和xmln ...

  6. [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

    Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...

  7. Spring 设值注入 构造注入 p命名空间注入

    注入Bean属性---构造注入配置方案 在Spring配置文件中通过<constructor-arg>元素为构造方法传参 注意: 1.一个<constructor-arg>元素 ...

  8. python命名空间

    在"python之禅"那几句话中有一句:namespace is a good thing. python对于命名空间的处理非常简单,下面的内容不一定真实,完全是我根据现象推测出来 ...

  9. thinkphp 命名空间

    什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文 ...

  10. 命名空间jquery

    命名空间的意思就是 同一个元素有绑定了2个相同的事件,比如2个scroll,这个时候你做其他交互的时候只想触发第二个scroll事件  就可以用命名空间做了 <button id="b ...

随机推荐

  1. C++多线程下的单例模式

    一.懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread s ...

  2. 希尔排序( Shell Sort)

    原文地址:http://www.stoimen.com/blog/,在此感谢作者! Insertion sort is a great algorithm, because it’s very int ...

  3. android之常用知识点(一)

    本文主要包括安卓一些常用的知识点 android常用的四种响应按钮点击事件的方法 android动态刷新界面 android常用的listView用法 android常用的handler的用法 and ...

  4. 7.适配器模式(Adapter Pattern)

    using System; namespace Test { /// <summary> /// 适配器模式主要解决的问题就是我们要调用的接口类型,无法满足我们新系统的使用需求, /// ...

  5. Wcf for wp8 使用iis Express 承载Wcf服务部署发布网站(三)

    我们接下来要做的是 本地电脑当作服务器(模拟外网服务器)来承载Wcf服务程序,通过引用本地电脑ip地址访问wcf服务程序接口 http://192.168.1.123/Service1.svc 一.先 ...

  6. hdu 3183 贪心

    题意:给一个数字,删掉其中的若干位,使得最后的数字最小 就是每次删除数的时候都是删掉第一个比右边数大的数 利用双向链表模拟 #include<cstdio> #include<ios ...

  7. js实现快速排序(in-place)简述

    快速排序,又称划分交换排序.以分治法为策略实现的快速排序算法. 本文主要要谈的是利用javascript实现in-place思想的快速排序 分治法: 在计算机科学中,分治法是建基于多项分支递归的一种很 ...

  8. 获取表信息(MSSQL)

    涉及到的系统表汇总 sys.databases sys.objects sys.indexes sys.tables sys.columns sys.data_spaces sys.partition ...

  9. Cygwin: connection closed by ::1

    问题描述:在Win7下Cygwin中,使用ssh localhost命令, 出现Connectionclosedby::1的问题. 解决方案:1.我的电脑-管理-找到CYGWINsshd. 2.右键 ...

  10. 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置

    涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...