首页 > 编程 > PHP > 正文

PHP中的命名空间

2020-03-22 16:21:08
字体:
来源:转载
供稿:网友
  • 概述

    命名空间的作用是解决命名冲突


    定义命名空间

    虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

    命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

    在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前

    同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。


    定义子命名空间
    namespace MyProjectSubLevel;

    在同一个文件中定义多个命名空间
    <?phpnamespace MyProject;const CONNECT_OK = 1;html' target='_blank'>class Connection { /* ... */ }function connect() { /* ... */  }namespace AnotherProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }?>

    不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法

    <?phpnamespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }}?>

    在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。


    使用命名空间

    命名空间中的元素可以通过相对路径和绝对路径访问

    file1.php

    <?phpnamespace FooBarsubnamespace;const FOO = 1;function foo() {}class foo{    static function staticmethod() {}}?>

    file2.php

    <?phpnamespace FooBar;include 'file1.php';const FOO = 2;function foo() {}class foo{    static function staticmethod() {}}/* 非限定名称 */foo(); // 解析为 FooBaroo resolves to function FooBaroofoo::staticmethod(); // 解析为类 FooBaroo的静态方法staticmethod。resolves to class FooBaroo, method staticmethodecho FOO; // resolves to constant FooBarFOO/* 限定名称 */subnamespaceoo(); // 解析为函数 FooBarsubnamespaceoosubnamespaceoo::staticmethod(); // 解析为类 FooBarsubnamespaceoo,                                  // 以及类的方法 staticmethodecho subnamespaceFOO; // 解析为常量 FooBarsubnamespaceFOO/* 完全限定名称 */FooBaroo(); // 解析为函数 FooBarooFooBaroo::staticmethod(); // 解析为类 FooBaroo, 以及类的方法 staticmethodecho FooBarFOO; // 解析为常量 FooBarFOO?>

    全局空间

    如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此

    在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称

    别名/导入

    为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。

    别名是通过操作符 use 来实现的

    <?phpnamespace foo;use MyFullClassname as Another;// 下面的例子与 use MyFullNSname as NSname 相同use MyFullNSname;// 导入一个全局类use ArrayObject;// importing a function (PHP 5.6+)use function MyFullunctionName;// aliasing a function (PHP 5.6+)use function MyFullunctionName as func;// importing a constant (PHP 5.6+)use const MyFullCONSTANT;?>

    一行中包含多个use语句

    <?phpuse MyFullClassname as Another, MyFullNSname;$obj = new Another; // 实例化 MyFullClassname 对象NSnamesubnsunc(); // 调用函数 MyFullNSnamesubnsunc?>

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表