• PHP命名空间


    PHP命名空间

    PHP 命名空间可以解决以下两类问题:

    1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
    2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

    定义命名空间

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

    语法格式:

    <?php
         //定义代码的命名空间
         namespace MyProject;
    
    ?>        
    

    在一个文件中也可以有多个命名空间

    <?php
         //定义代码的命名空间
         namespace MyProject1;
         namespace MyProject2;
         namespace MyProject3;
    ?>
    

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

    <?php
    declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
    namespace MyProject {
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
    }
    
    namespace { // 全局代码
    session_start();
    $a = MyProjectconnect();
    echo MyProjectConnection::start();
    }
    ?>
    

     语法错误代码

    <html>
    <?php
    namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句
    ?>
    

      

    子命名空间

    命名空间的名字可以使用分层次的方式定义:

    <?php
    namespace MyProjectSubLevel;  //声明分层次的单个命名空间
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function Connect() { /* ... */  }
    
    ?>
    

     

    命名空间使用

    PHP 命名空间中的类名可以通过三种方式引用:

    1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

    2. 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。

    3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。

     one

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

      two

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

     

    注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen() 或 Exception 或 INI_ALL。

    在命名空间内部访问全局类、函数和常量:

    <?php
    namespace Foo;
    
    function strlen() {}
    const INI_ALL = 3;
    class Exception {}
    
    $a = strlen('hi'); // 调用全局函数strlen
    $b = INI_ALL; // 访问全局常量 INI_ALL
    $c = new Exception('error'); // 实例化全局类 Exception
    ?>
    

      

    命名空间和动态语言特征

    PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

    example1.php 文件代码:

    <?php
    class classname
    {
        function __construct()
        {
            echo __METHOD__,"
    ";
        }
    }
    function funcname()
    {
        echo __FUNCTION__,"
    ";
    }
    const constname = "global";
    
    $a = 'classname';
    $obj = new $a; // prints classname::__construct
    $b = 'funcname';
    $b(); // prints funcname
    echo constant('constname'), "
    "; // prints global
    ?>
    

      

  • 相关阅读:
    写给QA/软件测试新人
    互联网产品线上故障管理规范
    爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?
    网传美团今年应届生年薪 35w+,严重倒挂老员工,为什么互联网大厂校招的薪资一年比一年高?...
    MySQL大表优化方案
    步入AI领域2年连升3级,我只是找对了学习方法而已……
    BZOJ 4008 亚瑟王(概率DP 奥妙重重)
    BZOJ 4318 OSU! (概率DP)
    BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
    BZOJ 4145 [AMPPZ2014]The Prices (状压DP)
  • 原文地址:https://www.cnblogs.com/shiyoushao/p/7993987.html
Copyright © 2020-2023  润新知