• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP中命名空间是怎样的存在二

php 搞代码 3年前 (2022-02-28) 27次浏览 已收录 0个评论
文章目录[隐藏]

明天带来的仍然是命名空间相干的内容,自身命名空间就是PHP中十分重要的一个个性。所以对于它的各种操作和应用还是非常复杂的,光应用形式就有很多种,咱们一个一个的来看。

子命名空间

命名空间自身就像目录一样,所以命名空间当然也是能够定义子命名空间的,真的就和操作系统的各种目录层级是齐全一样的。咱们通过简略的例子来看看。首先还是创立三个php文件,其中3-2和3-2-1是应用的雷同的二级命名空间,3-2-1在FILE32的根底上持续向下扩大了第三级的命名空间FILE321。他们都是MyProject命名空间的子命名空间。

<code class="php">// file3-1.php

namespace MyProject\FILE31;

function testA31(){
    echo 'FILE31\testA()', PHP_EOL;
}


// file3-2.php
namespace MyProject\FILE32;

const CONST_A32 = "file3-2";
function testA32(){
    echo 'FILE32\testA()', PHP_EOL;
}

class objectA32{
    function test(){
        echo 'FILE32\ObjectA', PHP_EOL;
    }
}

// file3-2-1.php

namespace MyProject\FILE32\FILE321;

function testA321(){
    echo 'FILE321\testA()', PHP_EOL;
}

接下来的应用就很简略了,和应用一级命名空间一样,间接应用use进行导入就能够了。

<code class="php">// 子命名空间
require 'namespace/file3-1.php';
require 'namespace/file3-2.php';
require 'namespace/file3-2-1.php';

use MyProject\FILE31;
use MyProject\FILE32;
use MyProject\FILE32\FILE321;

FILE31\testA31(); // FILE31\testA()
FILE32\testA32(); // FILE32\testA()
FILE32\FILE321\testA321(); // FILE321\testA()
FILE321\testA321(); // FILE321\testA()

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

PHP是容许在一个文件中定义多个命名空间的,然而并不举荐这么做,因为这样可能会带来各种未知的凌乱。在这里,咱们只有理解到能够这样应用就行了,在日常的开发中还是尽量要防止。

<code class="php">// file4.php
namespace FILE41;

function testA41(){
    echo 'FILE41\testA()', PHP_EOL;
}

namespace FILE42;

function testA42(){
    echo 'FILE42\testA()', PHP_EOL;
}

在应用中当然也和其余命名空间的应用没什么两样,间接use应用即可。

<code class="php">// 一个文件中多个命名空间
require 'namespace/file4.php';

use FILE41, FILE42;

FILE41\testA41(); // FILE41\testA()
FILE42\testA42(); // FILE42\testA()

非限定名称、限定名称、齐全限定名称

不要被术语吓到,这三个术语其实十分好了解。

  • 非限定名称,名称中不蕴含命名空间分隔符的标识符,例如 Foo 。
  • 限定名称,名称中含有命名空间分隔符的标识符,例如 Foo\Bar 。
  • 名称中蕴含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个齐全限定名称。

间接用例子来说就十分清晰了。

<code class="php">// 非限定名称、限定名称、齐全限定名称
use MyProject\FILE32\objectA32 as obj32;

$o = new obj32(); // 非限定名称
$o->test(); // FILE32\ObjectA

$o = new FILE32\objectA32(); // 限定名称
$o->test(); // FILE32\ObjectA

$o = new \MyProject\FILE32\objectA32(); // 齐全限定名称
$o->test(); // FILE32\ObjectA

namespace关键字和__NAMESPACE__常量

  • namesapce,显式拜访以后命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
  • __NAMESPACE__,蕴含以后命名空间名称的字符串。在全局的,不包含在任何命名空间中的代码,它蕴含一个空的字符串。

也是很简略的内容吧,间接来看例子。

<code class="php">// file5.php
namespace FILE5;

function test(){
    echo __NAMESPACE__ . ': test()', PHP_EOL;
}

// test.php
namespace Pro;
// namespace与__NAMESPACE__
require 'namespace/file5.php';

function test(){
    echo __NAMESPACE__ . ': test()', PHP_EOL;
}

namespace\test(); // Pro: test()

\FILE5\test(); // FILE5: test()

咱们给以后命名空间定义为Pro,引入了file5文件。这两个文件中都有一个test()办法,test()办法内都输入了__NAMESPACE__来打印以后的命名空间名称。而后在test.php中,通过namespace关键字调用的就是以后文件的Pro命名空间中的test()办法,输入的是 Pro: test() 。间接应用齐全限定名称调用FILE5的test()办法,输入了 FILE5: test() 。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%BA%8C%EF%BC%89%20.php

参考文档:
https://www.php.net/manual/zh/language.namespaces.nsconstants.php
https://www.php.net/manual/zh/language.namespaces.rules.php
https://www.php.net/manual/zh/language.namespaces.nested.php

https://www.php.net/manual/zh/language.namespaces.definitionmultiple.php

各自媒体平台均可搜寻【硬核项目经理】


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中命名空间是怎样的存在二

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址