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 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。

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

参考:

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

时间: 2024-10-31 09:06: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 数据类型 属