关于PHP中的命名空间

admin 2022年4月1日11:17:45评论44 views字数 2126阅读7分5秒阅读模式

# 关于PHP中的命名空间
By:0x584A Date:2015年10月28日 23:08:57

0x01 前言

最近都在啃ThinkPHP以及Yii2两个开源框架,其中比较重要的一个核心便是命名空间
起初写代码时没关注这个,但印象里老师有教过(其实是自己忘掉了)。所以今天便来恶补了下,其实理解起来挺简单并不难。

以前大学时捣鼓ASP.NET,也出去在网络公司工作了一年,小公司嘛大部分还是用工厂模式开发。随后便换了工作荒废了一年,现在才转入PHP的语言。说来真的惭愧,当在PHP中见到命名空间时
想起C#中就有,但因为很少用所以模模糊糊的。

0x02 为什么PHP中使用命名空间?

当两个php文件中定义了同名的类时,便会引起命名冲突的错误。列:

A.php<?phpclass setClass{    function getClass(){        echo "my Class -> A";     } }?>B.php<?phpclass setClass{    function getClass(){        echo "my Class -> A";     } }?>Test.php<?phprequire_once 'A.php';require_once 'B.php';?>

显示错误提示:

Fatal error: Cannot redeclare class setClass in H:yii2B.php on line 4

致命的错误:不能重新声明类setClass

0x03 如何使用命名空间

定义:

A.php<?phpnamespace aaa; # 定义名称aaaclass setClass{    function getClass(){        echo "my Class -> A";     } }?>B.php<?phpnamespace bbb; # 定义名称bbbclass setClass{    function getClass(){        echo "my Class -> A";     } }?>Test.php<?phprequire_once 'A.php';require_once 'B.php';?>

这样定义后,运行Test.php便不会出现类名冲突的问题了。

也可以将namespace bbb;改写成use bbb; 在实现效果上,两者都是一致的。

我们在使用时只需如下使用即可:

Test.php<?phprequire_once 'A.php';require_once 'B.php';$A = new aaasetClass; # 实例化命名空间aaa下的setClass类$A->getClass();?>

我们还可以改写成如下形式:

Test.php<?phprequire_once 'A.php';require_once 'B.php';use aaasetClass; # 引入名称空间aaa下的steClass类$A = new setClass; # 实例化setClass类$A->getClass();?>

0x04 命名空间的别名使用

当然出现如下代码时,会出现致命错误,说不能使用bbbsetClass用作实例化steClass,因为该名称已被使用。这时候就需要用到别名了。

Test.php<?phprequire_once 'A.php';require_once 'B.php';use aaasetClass; # 引入名称空间aaa下的steClass类use bbbsetClass; # 引入名称空间bbb下的steClass类$A = new setClass; # 实例化setClass类$A->getClass();?>

改写成如下格式:

Test.php<?phprequire_once 'A.php';require_once 'B.php';use aaasetClass;use bbbsetClass as bbb;$A = new bbb(); # 实例化别名bbb的setClass类$A->getClass();?>

0x05 全局命名空间

比如说,现在又有一个C.php,被引入到Test.php文件中。

C.php<?phpclass setClass{    function getClass(){        echo "my Class -> C";     } }?>Test.php<?phprequire_once 'A.php';require_once 'B.php';require_once 'C.php'; # 引入C.php文件?>

此时我们想要使用C.php的setClass类中getClass方法,则需在实例化时在前面加一个反斜杠‘’

<?phprequire_once 'A.php';require_once 'B.php';require_once 'C.php'; # 引入C.php文件$C = new setClass; # 加上'' 则说明实例化顶级空间中的setClass类$C->getClass();?>

原文始发于微信公众号(一个人的安全笔记):关于PHP中的命名空间

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月1日11:17:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于PHP中的命名空间http://cn-sec.com/archives/772061.html

发表评论

匿名网友 填写信息