thinkphp5多级命名空间
一、命名空间:
由于PHP语法里不支持函数重载机制,如果一个应用里有两个同名的方法,怎么办?在Yii框架为了避免名字重复引起问题,全部的类前边都有 C 字样,而在ThinkPHP里就引入了命名空间这个概念。其中有几点需要特别注意:
a) 命名空间是虚拟的定义空间,不是真实存在目录
b) 命名空间的分隔符都是反斜杠 \
c) 命名空间只对函数,类,常量(const定义的常量,非define定义的常量)有效。
d) 命名空间有三种访问方式:非限定名称访问方式;限定名称访问方式;完全限定名称访问方式。
接下来就一一详细说明。
二、多级命名空间和三种访问方式:
上面声明的命名空间space1和space2都是单级命名空间,形如 space1\space2\space3的命名空间为多级命名空间,分隔符为\。下面介绍三种命名空间访问方式:
1、非限定名称访问方式
<?php
namespace name1\space1;
function getmsg()
{
echo '123';
}
namespace name2\space2;
function getmsg()
{
echo "456";
}
getmsg();
输出结果为456;
2、完全限定名称访问方式
如果想要在 name2\space2 命名空间下访问 name1\space1下的getmsg()方法,可以使用完全限定名称访问方式(相当于绝对路径访问)。
<?php
namespace name1\space1;
function getmsg()
{
echo '123';
}
namespace name2\space2;
function getmsg()
{
echo "456";
}
\name1\space1\getmsg();
输出结果为123;
3、限定名称访问方式
限定名称访问方式与完全限定名称访问方式差别只在最前面的\。如果上例使用限定名称访问方式访问,则将最后一行改为:name1\space1\getmsg();
此时,我们在浏览器中打开,发现如下错误:
提示我们无法找到命名空间 name2\space2\name1\space1 下的 getmsg() 函数。原因是限定名称访问方式相当于相对路径访问,我们在当前命名空间下使用限定名称访问方式访问:name1\space1\getmsg(),会在当前命名空间下寻找name1\space1下的getmsg()函数,找不到就会报错。所以,如果我们再声明一个名为: name2\space2\name1\space1 的命名空间,上述访问就可以正常执行,如下:
<?php
namespace name1\space1;
function getmsg()
{
echo '123';
}
namespace name2\space2;
function getmsg()
{
echo "456";
}
name1\space1\getmsg();
namespace name2\space2\name1\space1;
function getmsg()
{
echo "789";
}
输出为789,其实就是相当于又创建里一个name2\space2\name1\space1的命名空间;
三、命名空间和空间类的引入原理:
通过上面的例子,我们可以看到如果想要在当前命名空间下使用另一个命名空间下的函数、常量或者类元素的时候,我们需要使用完全限定访问方式进行访问,写代码比较繁琐,所以,我们可以引入命名空间,然后使用限定名称访问方式进行访问,简化访问过程。
下面举一个例子:
1.命名空间:
用use关键词引入命名空间,再用限定命名方式:
2.空间类:
与命名空间的引入方式类似,使用 use 关键字引入空间类元素,然后直接使用非限定访问方式进行访问即可。不过,在当前命名空间下不能存在与引入类同名的类,否则会产生错误。
Animal后面加两个冒号是访问静态成员
输出结果为:dog大黄;
总结:
<?php
namespace name1\space1;
header("content-type:text/html;charset=utf-8");
class Animal
{
public $obj='dog';
static $name='大黄';
}
function getmsg()
{
echo '123';
}
namespace name2\space2;
class Animal
{
public $obj='pig';
static $name='哈哈哈哈哈';
}
function getmsg()
{
echo "456";
}
$animal=new Animal;
echo $animal->obj;//这个是访问动态成员
$animal2=new \name2\space2\Animal();
echo Animal::$name;//访问静态成员
//命名空间的引用
use name1/space1;
space1\getmsg();
//类的引用
$animal3=new Aniaml();
echo $animal3->obj;
echo $animal3::$name;
四、命名空间是虚拟的定义空间,不是真实存在目录 :
例如,我们打开 application/index/controller 文件夹下的 Index.php 文件,其命名空间为:app\index\controller。在目录结构中并不存在。
以上就是关于thinkphp中关于命名空间的全部内容,了解清楚之后就可以进行实战开发了。
上一篇: Linux网络协议栈:用eBPF写TCP拥塞控制算法
下一篇: python:命名空间学习
推荐阅读
-
C#001初始类和命名空间
-
php命名空间设计思想、用法与缺点分析
-
PHP 命名空间和自动加载原理与用法实例分析
-
PHP 命名空间原理与用法详解
-
Java Web项目前端规范(采用命名空间使js深度解耦合)
-
找不到类型或命名空间名称“Server”(是否缺少 using 指令或程序集引用?)
-
System.Web中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
-
System.Web中不存在类型或命名空间名称script 找不到System.Web.Extensions.dll引用
-
Python中规范定义命名空间的一些建议
-
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】