PHP 命名空间总结
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 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 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 命名空间总结的更多相关文章
- 【.net 深呼吸】细说CodeDom(3):命名空间
在上一篇文章中,老周介绍了表达式和语句,尽管老周没有把所有的内容都讲一遍,但相信大伙至少已经掌握基本用法.在本文中,咱们继续探讨 CodeDom 方面的奥秘,这一次咱们聊聊命名空间. 在开始之前,老周 ...
- C++中的命名空间
一,命名空间(namespace)的基本概念以及由来 1.什么是标识符: 在C++中,标识符可以是基本的变量,类,对象,结构体,函数,枚举,宏等. 2.什么是命名空间: 所谓的命名空间是指标识符的可见 ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- .Net 序列化(去除默认命名空间,添加编码)
1.序列化注意事项 (1).Net 序列化是基于对象的.所以只有实例字段呗序列化.静态字段不在序列化之中. (2)枚举永远是可序列化的. 2.XML序列化时去除默认命名空间xmlns:xsd和xmln ...
- [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- Spring 设值注入 构造注入 p命名空间注入
注入Bean属性---构造注入配置方案 在Spring配置文件中通过<constructor-arg>元素为构造方法传参 注意: 1.一个<constructor-arg>元素 ...
- python命名空间
在"python之禅"那几句话中有一句:namespace is a good thing. python对于命名空间的处理非常简单,下面的内容不一定真实,完全是我根据现象推测出来 ...
- thinkphp 命名空间
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文 ...
- 命名空间jquery
命名空间的意思就是 同一个元素有绑定了2个相同的事件,比如2个scroll,这个时候你做其他交互的时候只想触发第二个scroll事件 就可以用命名空间做了 <button id="b ...
随机推荐
- WordPress环境配置与安装
要安装wordpress,要安装apache,php,mysql,还要进行一系列复杂的配置,较为复杂. apache安装 php5.5.6 下载链接:http://windows.php.net/do ...
- svn: warning: 'xxxxxx' is already under version control
[root@NGINX-APACHE-SVN pm]# svn status ? plugins ? files ? images ? data ? resources [root@NGINX-APA ...
- Jquery的tmpl
jquery 中的tmpl类似于asp.net中的datalist控件. 首选,在页面代码中加入两行,jquery的js文件引用 <script src="http://code.jq ...
- GDUT 校赛02 dp回文串
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABSkAAAIhCAIAAAAtmainAAAgAElEQVR4nOzdfaxkd33n+ZJacstqa3 ...
- poj 3225 线段树+位运算
略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...
- Linux下打包压缩war和解压war包
Linux下打包压缩war和解压war包 unzip是一种方法,如果不行则采用下面的方法 把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建wa ...
- Effective C++ 学习笔记[2]
2. 第一节 习惯C++ 2.1 C++是一个语言联邦,包括以下四个部分: C:包括区块.语句.预处理器.内置数据类型.数组.指针等,但是C语言本身存在局限:没有模板template.没有异常exce ...
- A strange lift
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- eBay 消息发送(2)
1.简介 Call Index Doc: http://developer.ebay.com/DevZone/XML/docs/Reference/eBay/index.html 消息发送主要 ...
- android Intent.ACTION_SEND
ACTION_SEND intent 可以把自己的应用添加到系统的发送(分享)列表中. <intent-filter> <action android:name="andr ...