PHP命名空间namespace

什么是namespace?

官方解释命名空间是 一种封装事物的方法。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

namespace 的定义和使用

  • 定义:

    <?php
    namespace Myproject;
    

    或者:

    <?php 
    namespace Myproject{
    
    }
    
  • 使用

    <?php 
    use Myproject/School
    

    或者

    <?php
    use Myproject/School AS MYSchool
    

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

  • test.php

    <?php
    use my\name;
    require_once("/home/yejianfeng/handcode/test/namespace1.php");
    $a = new my\name\A();
    $a->Print1();
    
  • namespace1.php

    <?php
    namespace my\name;
    class A {
            public function Print1(){
                    echo 11;
            }
    }
    

孙然test.php的require_once 在use的下面,也是可以正常运行的,因为程序只哟偶在new my\name\A() 的时候,才会去架子啊命名空间my\name

全局类和命名空间类

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

命名空间的顺序

<?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"
?>

原文来自:[http://www.cnblogs.com/yjf512/archive/2013/05/14/3077285.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 收藏自cnblog,写的非常清晰,感谢作者‘流金岁月’http://www.cnblogs.com/kuyuecs...
    InitialX阅读 4,890评论 0 5
  • 提出问题 解决问题--命名空间的使用 PHP的命名空间(namespace)是php5.3之后才有的。这个概念在C...
    洞房花猪阅读 7,830评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,803评论 19 139
  • PHP 是服务器端脚本语言; PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文...
    wyude阅读 3,359评论 2 5
  • 一 你放不下这天 还挂念着地 你若走了 天会不会哭 地是否会跟着躺泪! 二 弯弯的月如钩 勾着的是记忆 记忆这最不...
    路易斯阿呆阅读 1,364评论 2 3

友情链接更多精彩内容