欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

namespace命名空间的使用

发布时间:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 namespace命名空间的使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、何为命名空间

PHP 命名空间(namespace)是在PHP 5.3中加入的。“什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。”命名空间可以解决以下两类问题:

  • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
  • 二、命名空间的使用概要

    Tips:以下示例中成为了两个文件,一个Demo.php,一个index.php,两个文件处于同级目录下;Demo.php文件中书写命名空间以及Demo类,index.php调用Demo.php中的Demo类;如下示例中的“输出结果”即表示浏览器访问index.php。

    (一)、简单示例

    Demo.php文件代码:

    <?php namespace DemoNameSpace;class Demo {private $mysqlHandle;public function __construct() {echo '这是PHP演示的名称空间,(PHP的魔术常量"__NAMESPACE__")当前命名空间的名称是 '.__NAMESPACE__;} } ?>

    index.php文件代码:

    <?phpinclude 'Demo.php';use DemoNameSpace\Demo;$DemoObj = new Demo(); ?>

    输出结果:这是PHP演示的名称空间,(PHP的魔术常量"__NAMESPACE__")当前命名空间的名称是DemoNameSpace
      以上示例中使用的魔法常量__NAMESPACE__的意思是当前命名空间的名称(区分大小写)。

    (二)、报错示例

    Demo.php不做变动,改动index.php文件,如下:

    <?phpinclude 'Demo.php';$Demo = new Demo(); ?>

    输出结果:“Fatal error: Class ‘Demo’ not found in D:\WWW\demo\index.php on line 4”

    这个是常见的“致命错误”信息。之所以会出现这样的错误,是因为我们在Demo.php中使用了命名空间:namespace DemoNameSpace 。我们把Demo.php中的这行代码注释掉后。这个语句,就正常了。这是咱们平常写class以及调用class最常见的书写方法,这里就不介绍了。

    对比使用namespace与不使用namespace的两种输出情况,并加入namespace的定义理解后,上述出现致命错误的情况就很好理解了。在Demo.php中定义了一个namespace,也就是命名空间后,接着定义了Demo类,然后这个Demo类就被归并到了DemoNameSpace命名空间中去了,那么要调用这个Demo类时,自然要先调用这个DemoNameSpace命名空间了,也就是在index.php文件中使用“useDemoNameSpace\Demo”语句了。

    (三)、稍复杂的示例

    Demo.php文件代码:

    <?php header("content-type:text/html;charset=utf-8); namespace DemoNameSpace; class Demo {private $mysqlHandle;public function __construct() {echo '这是PHP演示的名称空间,(PHP的魔术常量"__NAMESPACE__")当前命名空间的名称是 '.__NAMESPACE__;} }namespace DemoNameSpace1; const constDefine = 'Tom'; class Demo {private $mysql;const constant = 'Jerry';public function __construct() {echo 'The const constant outside class is: '.constDefine;echo ' and ';echo 'The const constant inside class is: '.self::constDefine;} } ?>

    index.php文件代码

    <?php// 在同级目录下include 'Demo.php';use DemoNameSpace\Demo as Test;//给同类名添加别名$Demo = new Test;echo "<br/>";//换行use DemoNameSpace1\Demo as Test1;//给同类名添加别名$Demo1 = new Test1();echo "<hr/>";//横线echo DemoNameSpace1\constDefine; ?>

    输出结果:
      这是PHP演示的名称空间,(PHP的魔术常量"NAMESPACE")当前命名空间的名称是DemoNameSpace`
    The const constant outside class is: Tom and The const constant inside class is: Jerry Tom


    三、namespace总结

    1、namespace前面不要有任何代码,注释除外。不管是header("content-type:text/html;charset=utf-8);还是其他什么代码。都要放在namespace的后面。否则会报错。
      2、命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class。
      3、公共空间:可以简单的理解,没有定义命名空间的方法(函数)、类库(class)、属性(变量)都默认归属于公共空间。这样就解释了为php5.3.0以前版本书写的代码大部分为何在php5.3.0及其以上版本还能正常运行的原因。另外:公共空间中的代码段被引入到某个命名空间下后,该公共空间中的代码段不属于任何命名空间!
      4、就如目录结构一样,命名空间也有子命名空间的概念,具体就不再举例说明了。

    总结

    以上是生活随笔为你收集整理的namespace命名空间的使用的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。