PHP命名空间笔记

此篇文章作为我从开始学习php到工作一段时间后的命名空间知识点总结,会随学习和工作的提高而完善

【1】命名空间

定义命名空间意义
一:为了解决多文件中(相互引入时)类名,常量名,函数名可能会重复命名的问题
二:快速定位文件位置
三:就是给文件加个隐式前缀

四:命名空间需要写在文件的最前面

【2】全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。

在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。 

可类比Linux的根木录/

【3】一个文件多个命名空间
按定义名称理解即可
定义方式:按上下文顺序书写
a.php
namespace:xxx
代码1
namespace:yyy

代码2

当然,多个文件的命名空间也可相同

【4】非限定名称:
为本文件定义命名空间后
调用本文件内的函数,类,变量时,系统默认从本文件内的命名空间查找
对应的名称的函数,类,变量

例如 

$a=new foo(); 
//或
$a=foo::staticmethod();
 //如果当前命名空间是currentnamespace,foo 将被解析为 currentnamespace\foo

【5】限定名称

//限定名称,或包含前缀的名称,例如
 $a = new subnamespace\foo(); 
//或
 subnamespace\foo::staticmethod();
//如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo

【6】完全限定名称

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

就我个人而言,完全限定名称使用频率最多,它从全局空间\出发,描述了调用类,方法,常量相对全局的位置,定位精确

额外细节
如果在当前【命名空间】中使用某一个类,默认优先级是当前空间查找并使用,;

所有要在当前命名空间内使用且不属于当前空间的类,需要先导入一下该类,比如PDO这个php的扩展类

<?php
//a.php中
namespace app;
$pdo = new \PDO();//此处通过完全限定名称导入全局空间的pdo类,该类被内置于php的pdo扩展中

函数和常量有所不同
函数常量执行的机制:先在当前空间查找,如果没有找到则退而使用全局空间的函数、常量(php内部自动按优先级查询),面向对象的编程过程中基本都是类对象式的调用,函数和常量设计较少

【7】导入命名空间

通常来说使用完全限定名称的时候会面临需要前面写一大长串的完全限定名称的麻烦,尤其在一个类多个方法里多次调用时,这里就引出了导入的概念

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接

下方例子引自php官方手册

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
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(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>

为了简化操作,PHP还支持在一行中使用多个use语句

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

为了解决require文件后调用其中类,函数方法每次调用时都要加载完全限定名称
我们使用了导入解决,换言之,导入可有可无,但有了可以简化操作(非常简化!强烈推荐使用)

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。

一些重要细节:
有了命名空间后,我们如果还是想之前那样require了含有命名空间的文件
直接调用require过来的代码是会出错的
必须先使用空间或者导入空间后才能使用

命名空间的动态语言特性
命名空间可以保存到变量中,这就体现了动态语言的特性
如果把命名空间保存到变量中的话,必须使用完全限定名称,
由于限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值