系统学习PHP之命名空间

在PHP中,命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面直接通过实例练习命名空间的使用:

定义命名空间

#1 不使用命名空间且使用相同函数名称:

代码获取报错如下:

Fatal error: Cannot redeclare funcName()

#2 使用命名空间后正常执行:

与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。

#3 声明分层次的单个命名空间

注意,定义命名空间前不可有任何输出,否则报错;

#4 定义命名空间前输出数据

以上代码报错:

Fatal error: Namespace declaration statement has to be the very first statement in the script

额外注意:使用define()函数定义相同名称的常量,即使使用命名空间同样会报错。

#5 使用define()函数定义常量:

代码获取报错如下:

Notice: Constant A already defined

#6 使用const方式定义常量既不会报错:

所以得出结论,尽量使用 const 定义常量的方法;

访问命名空间

PHP 命名空间与文件系统访问一个文件的方式一样,通过三种方式引用,分别是非限定名称、限定名称、完全限定名称。同样的,通过栗子说明该三种方式的差异。

#1 非限定名称

namespace space1;const A='atong';namespace space2;const A='fan';echo A; # fan

例子中的 A 相当于 space2/A ;

#2 限定名称

echo space1\A; # Undefined constant 'space2\space1\A'

例子中的space1\A相当于space2\space1\A;

#3 完全限定名称:

echo \space1\A; #atong

例子中的\space1\A相当于space1\A; 结论:与路径的使用方法几乎一样一样的,习惯上会使用完全限定名称的方式出错的几率会低一些。

use

#1 额外介绍一下关于空间引入,也就是 use 的使用,这方便我们使用命名空间

namespace a\b\c\d;const A='atong';namespace space2;const A='fan';echo A; #fanuse a\b\c\d;echo d\A; #atong

#2 空间类元素的引入,与空间引入差不多:

公共空间

如果没有使用到限定命名空间即为公共空间,但在命名空间下include一公共空间会有说明结果呢?例子说明 #1 创建1.php,输入代码,即作为公共空间:

#2 创建2.php,输入代码

此时,在2.php三种方式中输出的结果:

echo A; //atongecho \A; //fanecho B; //ab

结论:命名空间不影响引入的公共空间的内容(A),需要访问公共空间的元素需要使用完全限定名称方式(\A),如果访问命名空间中的元素不存在,及前往公共空间中访问(B);

其实命名空间需要结合文件命名规则才能实现我们类库的自动加载,之后再详细记录吧,以上是命名空间全部内容。

THE END

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180310G00NG100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券