PHP的命名空间解说

PHP的命名空间

PHP的命名空间(namespace)是php5.3之后才有的。这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的。

为什么php中要使用namespace?

假 设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的 类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如 project1_school1_class1_Student或者project2_school_class_Student。

引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,个人博客就会去对应的文件路径查找类定义文件了。

namespace的定义和使用

定义:


1

2

3

<?php

namespace Myproject;

或者


1

2

3

4

5

<?php

namespace Myproject {

}

使用:


1

2

3

<?php

use Myproject/School;


1

2

3

<?php

use Myproject/School as School1;   // 别名

命名空间是运行时解析的。use就相当于一种声明,并不解析和加载。比如下面这个例子:

test.php


1

2

3

4

5

<?php

use my\name;

require_once("/home/yejianfeng/handcode/test/namespace1.php");

$a = new my\name\A();

$a->Print1();

namespace1.php


1

2

3

4

5

6

7

<?php

namespace my\name;

class A {

        public function Print1(){

                echo 11;

        }

}

虽然require_once在use下面,也是可以正常运行的,因为程序只有在new my\name\A()的时候才去加载命名空间my\name

全局类和命名空间类

如果要new一个全局类使用 new \A()

如果要new一个命名空间类,使用new my\namespace\A()

命名空间的顺序

自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。

如果能弄清楚manual中的这个例子就能全部弄清楚寻找顺序了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

<?php

namespace A;

use B\D, C\E as F;

// 函数调用

foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()

            // 再尝试调用全局函数 "foo"

\foo();     // 调用全局空间函数 "foo"

my\foo();   // 调用定义在命名空间"A\my"中函数 "foo"

F();        // 首先尝试调用定义在命名空间"A"中的函数 "F"

            // 再尝试调用全局函数 "F"

// 类引用

new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象

            // 如果未找到,则尝试自动装载类 "A\B"

new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象

            // 如果未找到,则尝试自动装载类 "B\D"

new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象

            // 如果未找到,则尝试自动装载类 "C\E"

new \B();   // 创建定义在全局空间中的类 "B" 的一个对象

            // 如果未发现,则尝试自动装载类 "B"

new \D();   // 创建定义在全局空间中的类 "D" 的一个对象

            // 如果未发现,则尝试自动装载类 "D"

new \F();   // 创建定义在全局空间中的类 "F" 的一个对象

            // 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

B\foo();    // 调用命名空间 "A\B" 中函数 "foo"

B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法

            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"

D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法

            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"

\B\foo();   // 调用命名空间 "B" 中的函数 "foo"

\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法

            // 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法

              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"

\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法

              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"

时间: 2024-10-03 23:22:03

PHP的命名空间解说的相关文章

【开源】OSharp框架解说系列(3):扩展方法

〇.前言 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.

SQL注入原理解说,非常不错!

原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序猿社区CSDN站点的用户数据库被黑客公开公布,600万用户的登录名及password被公开泄露,随后又有多家站点的用户password被流传于网络,连日来引发众多网民对自己账号.password等互联网信息被盗取的普遍担忧. 网络安全成为了如今互联网的焦点,这也恰恰触动了每一位用户的神经,因为设计的漏洞导致了不可收拾的恶果,验证了

命名空间

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+)/$'] 出错原因