温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用及定义PHP中的命名空间

发布时间:2021-10-25 15:35:07 来源:亿速云 阅读:90 作者:iii 栏目:编程语言

本篇内容主要讲解“如何使用及定义PHP中的命名空间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用及定义PHP中的命名空间”吧!

如何使用及定义PHP中的命名空间

命名空间其实是个抽象的概念,举个例子,在我们日常生活中,操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。

那么什么是命名空间呢?其实,命名空间可以理解为封装事物的方法,在PHP中的类、函数、常量是不能够同名的,为了不让他们同名,解决三者的同名问题,所以需要用到命名空间。

在PHP中,命名空间主要用来解决用户编写的代码与PHP内部或者第三方的类、函数、常量之间的命名冲突,文件太多的时候总会有可能命名会重复;还有为很长的标识符名称创建一个很简短的名称,这样的话会提高代码的可读性。

那么命名空间是怎样声明也就是定义和使用的呢?接下来我们来看一下应该如何定义命名空间吧!

定义命名空间

在PHP中任意正确的代码都可以包含在命名空间中,但是只有类、函数、常量等类型的代码才会收到命名空间的影响。

我们通过namespace关键字来完成命名空间的定义,它的语法格式如下:

namespace 命名空间名;

示例如下:

<?php  
// 定义代码在 'named' 命名空间中  
namespace named;    //在这里可以不使用大括号
 
// ... 代码 ...  
?>
  • 定义两个命名空间:

<?php
namespace MyProject {    //这里建议大家使用大括号,这里定义了一个名为MyProject的命名空间
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
namespace Another {   //这里定义了一个名为Another的命名空间
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>
  • 定义子命名空间

PHP中的命名空间与目录和文件的关系是很像的,可以允许指定层次化的命名空间名称。因此,命名空间的名字可以使用分层次的方式来定义,它的语法格式如下:

namespace App\Model;
namespace App\Controller\Home;

示例如下:

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

在上述事例中,创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect

  • 在同一个文件中,定义多个命名空间

我们有两种语法格式可以在一个文件中定义多个命名空间,示例如下:

首先就是简单的语法组合

<?php
    namespace named;
    const CONNECT_OK = 1;
    class className {
        /* ... */
    }
    namespace names;
    const CONNECT_OK = 1;
    class className {
        /* ... */
    }
?>

然后就是大括号{}

<?php
    namespace named{
        const CONNECT_OK = 1;
        class className {
            /* ... */
        }
    }
    namespace names{
        const CONNECT_OK = 1;
        class className {
            /* ... */
        }
    }
?>

通过上述的介绍,我们已经知道了应该如何定义命名空间,只是定义命名空间还不够,我们在PHP中使用它才是比较重要的,那接下来看一下应该如何使用命名空间。

使用命名空间

在了解应该如何使用命名空间之前,我们应该要了解的是在PHP中是怎么知道要是用哪一个命名空间中的元素的,这时候我们就需要知道PHP中命名空间元素访问的原理了。首先PHP中的我们不太清楚,但是文件系统我们可以总结出访问文件的三种方式:

相对文件名、相对路径名和绝对路径名。

PHP命名空间的元素只用同样的原理,例如命名空间下的类名可以通过三种方式引出:

  • 非限定名称,或不包含前缀的类名称,例如$a = new test()或者test,如果当前命名空间是currentnamespace,那么test将被解析为currentnamespace\test。如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为test。

  • 限定名称,或包含前缀名称,例如$a = new subnamespace\test(),如果当前命名空间是currentnamespace,则 test 会被解析为 currentnamespace\subnamespace\test,如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为subnamespace\foo。

  • 完全限定名称,或包含了全局前缀操作符的名称,例如$a = new \currentnamespace\test(),这种情况下,test 总是被解析为代码中的文字名 currentnamespace\test。

下面是一个使用这三种方式的实例,我们需要两个 PHP 源文件,分别是 demo.php 和 index.php,示例代码如下:

<?php
    namespace Test\Bar\Demo;
    const FOO = 1;
    function foo() {}
    class foo
    {
        public function demo() {
            echo '命名空间为:Test\Bar\Demo';
        }
    }
?>
<?php
    namespace Foo\Bar;
    include 'Demo.php';
    const FOO = 2;
    function foo() {
        echo 'Foo\Bar 命名空间下的 foo 函数<br>';
    }
    class foo
    {
        static function demo(){
            echo '命名空间为:Foo\Bar<br>';
        }
    }
    /* 非限定名称 */
    foo();                  // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
    foo::demo();            // 解析为类 Foo\Bar\foo 的静态方法 staticmethod。
    echo FOO.'<br>';        // 解析为常量 Foo\Bar\FOO
    /* 限定名称 */
    Demo\foo();             // 解析为函数 Foo\Bar\Demo\foo
    Demo\foo::demo();       // 解析为类 Foo\Bar\Demo\foo,
                            // 以及类的方法 demo
    echo Demo\FOO.'<br>';   // 解析为常量 Foo\Bar\Demo\FOO
                                     
    /* 完全限定名称 */
    \Foo\Bar\foo();         // 解析为函数 Foo\Bar\foo
    \Foo\Bar\foo::demo();   // 解析为类 Foo\Bar\foo, 以及类的方法 demo
    echo \Foo\Bar\FOO.'<br>'; // 解析为常量 Foo\Bar\FOO
?>

在上述事例中,我们需要注意的是,访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 等。

别名、导入

PHP 允许通过别名引用或导入的方式来使用外部的命名空间,这是命名空间的一个重要特征。

在PHP中,通过use关键字和as配合可以实现命名空间的导入和设置别名。它的语法格式如下:

use 命名空间 as 别名;

示例如下:

<?php
    namespace foo;
    use My\Full\Classname as Another;
    // 下面的例子与 use My\Full\NSname as NSname 相同
    use My\Full\NSname;
    // 导入一个全局类
    use ArrayObject;
    // 导入一个函数
    use function My\Full\functionName;
    // 导入一个函数并定义别名
    use function My\Full\functionName as func;
    // 导入一个常量
    use const My\Full\CONSTANT;
    $obj = new namespace\Another;   // 实例化 foo\Another 对象
    $obj = new Another;             // 实例化 My\Full\Classname 对象
    NSname\subns\func();            // 调用 My\Full\NSname\subns\func 函数
    $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
                                    // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
    func();                         // 调用 My\Full\functionName 函数
    echo CONSTANT;                  // 打印 My\Full\CONSTANT 常量
?>

其中需要注意的是,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

到此,相信大家对“如何使用及定义PHP中的命名空间”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI