栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

今天带来的依然是命名空间相关的内容,本身命名空间就是PHP中非常重要的一个特性。所以关于它的各种操作和使用还是非常复杂的,光使用方式就有很多种,我们一个一个的来看。

子命名空间

命名空间本身就像目录一样,所以命名空间当然也是可以定义子命名空间的,真的就和操作系统的各种目录层级是完全一样的。我们通过简单的例子来看看。首先还是创建三个php文件,其中3-2和3-2-1是使用的相同的二级命名空间,3-2-1在FILE32的基础上继续向下扩展了第三级的命名空间FILE321。他们都是MyProject命名空间的子命名空间。

// file3-1.php

namespace MyProjectFILE31;

function testA31(){
    echo 'FILE31testA()', PHP_EOL;
}


// file3-2.php
namespace MyProjectFILE32;

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

class objectA32{
    function test(){
 echo 'FILE32ObjectA', PHP_EOL;
    }
}

// file3-2-1.php

namespace MyProjectFILE32FILE321;

function testA321(){
    echo 'FILE321testA()', PHP_EOL;
}

接下来的使用就很简单了,和使用一级命名空间一样,直接使用use进行导入就可以了。

// 子命名空间
require 'namespace/file3-1.php';
require 'namespace/file3-2.php';
require 'namespace/file3-2-1.php';

use MyProjectFILE31;
use MyProjectFILE32;
use MyProjectFILE32FILE321;

FILE31testA31(); // FILE31testA()
FILE32testA32(); // FILE32testA()
FILE32FILE321testA321(); // FILE321testA()
FILE321testA321(); // FILE321testA()

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

PHP是允许在一个文件中定义多个命名空间的,但是并不推荐这么做,因为这样可能会带来各种未知的混乱。在这里,我们只要了解到可以这样使用就行了,在日常的开发中还是尽量要避免。

// file4.php
namespace FILE41;

function testA41(){
    echo 'FILE41testA()', PHP_EOL;
}

namespace FILE42;

function testA42(){
    echo 'FILE42testA()', PHP_EOL;
}

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

// 一个文件中多个命名空间
require 'namespace/file4.php';

use FILE41, FILE42;

FILE41testA41(); // FILE41testA()
FILE42testA42(); // FILE42testA()
非限定名称、限定名称、完全限定名称

不要被术语吓到,这三个术语其实非常好理解。

  • 非限定名称,名称中不包含命名空间分隔符的标识符,例如 Foo 。
  • 限定名称,名称中含有命名空间分隔符的标识符,例如 FooBar 。
  • 名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 FooBar。 namespaceFoo 也是一个完全限定名称。

直接用例子来说就非常清晰了。

// 非限定名称、限定名称、完全限定名称
use MyProjectFILE32objectA32 as obj32;

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

$o = new FILE32objectA32(); // 限定名称
$o->test(); // FILE32ObjectA

$o = new MyProjectFILE32objectA32(); // 完全限定名称
$o->test(); // FILE32ObjectA

namespace关键字和__NAMESPACE__常量
  • namesapce,显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
  • NAMESPACE,包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

也是很简单的内容吧,直接来看例子。

// 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;
}

namespacetest(); // Pro: test()

FILE5test(); // FILE5: test()

我们给当前命名空间定义为Pro,引入了file5文件。这两个文件中都有一个test()方法,test()方法内都输出了__NAMESPACE__来打印当前的命名空间名称。然后在test.php中,通过namespace关键字调用的就是当前文件的Pro命名空间中的test()方法,输出的是 Pro: test() 。直接使用完全限定名称调用FILE5的test()方法,输出了 FILE5: test() 。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号