PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别

这篇文章主要介绍“PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别”,在日常操作中,相信很多人在PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为日照等地区用户提供了全套网页设计制作服务,及日照网站建设行业解决方案。主营业务为网站设计、成都做网站、日照网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

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

子命名空间

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

// 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进行导入就可以了。

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

// file4.php
namespace FILE41;

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

namespace FILE42;

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

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

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

use FILE41, FILE42;

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

非限定名称、限定名称、完全限定名称

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

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

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

// 非限定名称、限定名称、完全限定名称
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,包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

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

// 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()
    

到此,关于“PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章题目:PHP中命名空间是怎样的存在以及非限定名称、限定名称、完全限定名称的区别
文章起源:http://hbruida.cn/article/jiihgo.html