PHP命名空间

标签: php命名空间 php命名空间介绍 php命名空间详解
15人阅读 评论(0) 收藏 举报
分类:

什么是PHP命名空间

PHP手册:从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。

命名空间的作用

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

示例

写这个命名空间的文章是因为一个朋友刚学这个来问我命名空间到底是个什么东西。我在想怎么简单的描述出来并且很容易理解。下面我就以几个简单的小例子来说明一下我自己对命名空间的理解。

1. 例一
首先我们先建立两个类文件
a.php

class Test
{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

class Test
{
    public function test()
    {
        echo "this is B class.";
    }
}

再建立一个index.php文件,来引入以上两个类并调用其中的方法。
index.php

require_once("a.php");
require_once("b.php");

现在运行index.php文件,你会发现有一个致命错误: Fatal error: Cannot redeclare class Test in。。。很显然,无法重新声明Test类,因为你引入了两次,而且两个文件中的类名称相同,冲突了。这个时候就需要命名空间来解决这个问题,并且很容易。
2. 例二
我们现在把两个类文件稍作修改。
a.php

namespace a\test;

class Test
{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;

class Test
{
    public function test()
    {
        echo "this is B class.";
    }
}

namespace关键字是用来声明命名空间的。现在运行index.php发现没有错误,修改index.php进行方法调用测试
index.php

require_once("a.php");
require_once("b.php");

$a = new a\test\Test();
$a->test();

//页面输出:this is A class.

3. 例三
现在有另外一种情况,比如我需要实例化a.php中的Test类多次,那么每次我们都需要命名空间信息完整写的话比较麻烦怎么办呢?比如:
index.php

require_once("a.php");
require_once("b.php");

$a = new a\test\Test();
$a_a = new a\test\Test();
$a_b = new a\test\Test();
$a->test();
$a_a->test();

//页面输出:this is A class.this is A class.

虽然也没有错误,但是你会发现比较麻烦,每次都需要全写命名空间名称,虽然不报错并且可以ctrl+c,ctrl+v,但是不太美观(^_^)。
你可以这样做:
index.php

require_once("a.php");
require_once("b.php");

use a\test\Test;

$a = new Test();
$a_a = new Test();
$a_b = new Test();
$a->test();
$a_a->test();

//页面输出:this is A class.this is A class.

use关键字是用来引入类,用命名空间的方式表示使用了某个类。后面就可以直接实例化操作
4. 例五
接下来另一个问题又来了,如下:
index.php

require_once("a.php");
require_once("b.php");

use a\test\Test;
use b\test\Test;

$a = new Test();
$b = new Test();
$a->test();
$b->test();

很明显,又一个致命错误:Fatal error: Cannot use b\test\Test as Test because the name is already in use in 。。。因为虽然使用了命名空间,但是两个类名称相同,都是Test,程序不知道第二个Test类是b.php中的Test类,这时候你就用到了as关键字
如:
index.php

require_once("a.php");
require_once("b.php");

use a\test\Test;
use b\test\Test as BTest;

$a = new Test();
$b = new BTest();
$a->test();
$b->test();
//页面输出:this is A class.this is B class.完美解决

as关键字是对类名称定义别名,可以有效防止类名称相同冲突
5. 例六
下面是另一种情况,我先给出几个代码片段,是Yii2框架中的,和框架无关,只是为了演示使用,很多地方都能见到此例。

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();
           ...
        }

很显然这里使用了一个Yii类,但是为什么前面又一个反斜杠”\”,我们先追踪一下Yii类,有的同学会问怎么追踪呢,如果你使用的是PHPstorm编辑器,直接按住Ctrl,鼠标点击类名就会跳到此类类文件中,关于怎么使用PHPstorm编辑器,请查看:PhpStorm破解版及使用教程
下面是Yii类文件代码段:

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
require(__DIR__ . '/BaseYii.php');

class Yii extends \yii\BaseYii
{
}

你会发现该Yii类并没有命名空间,我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\”
比如我们在a.php同级再建立一个全局类文件:c.php:

class Test
{
    public function test()
    {
        echo "this is C class.";
    }
}

在index.php文件中这样做即可调用c.php中的test方法

require_once("a.php");
require_once("b.php");
require_once("c.php");

use a\test\Test;
use b\test\Test as BTest;

$a = new Test();
$b = new BTest();
$c = new \Test();
$a->test();
$b->test();
$c->test();
//页面输出:this is C class.this is A class.this is B class.this is C class.

注意:namespace,use,as等关键字用法以及全局类的使用。

查看评论

PHP命名空间的使用,PHP命名空间实例

  • 2017年07月10日 17:03
  • 784B
  • 下载

php命名空间的设计思想和缺点

相比C#等语言,你可以在php函数里面随意定义变量并赋值,而不用担心覆盖了全局变量,或者类变量;你也可以随意的定义类变量,而不用担心会和函数名冲突,因为变量前面都有个$。php的命名空间和全局变量、局...
  • llj1985
  • llj1985
  • 2016-04-19 12:27:10
  • 1598

php命名空间的基本使用

1.命名空间概述。 1.1什么是命名空间? 从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到 这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它...
  • RandolfJay
  • RandolfJay
  • 2017-06-05 08:52:13
  • 334

如何理解php中命名空间概念

PHP中命名空间的本质是容器,可以起到封装的作用。 在这个容器中中我们可以放入变量,函数,类。 php命名空间概念的理解可以类比于文件目录,在操作系统中目录用来将相关文件分组,对于目录中的文件来说...
  • qlzx_syzx
  • qlzx_syzx
  • 2015-07-31 22:49:40
  • 1452

php命名空间namespace全解

php的命名空间namespace全解
  • ss22_xiha
  • ss22_xiha
  • 2016-09-28 21:48:39
  • 499

PHP中的命名空间

PHP中的命名空间 原发表于:https://www.zybuluo.com/phper/note/65479 php是世界上最伟大的语言!霸气开场(^__^) 1. 什么是命名空间? ...
  • yangyi2083334
  • yangyi2083334
  • 2015-01-25 15:38:25
  • 1482

PHP中的命名空间(namespace)及其使用详解

php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入);那么什么是命名空间呢?php官网已很明确的进行了定...
  • dahuzix
  • dahuzix
  • 2015-06-28 15:12:19
  • 10134

PHP手册-__NAMESPACE__关键字(命名空间中继承其他命名空间中类注意)

常量__ NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。 When extending a class from anothe...
  • dizzthxl
  • dizzthxl
  • 2012-08-05 16:53:52
  • 5031

php命名空间namespace自动载入

php的命名空间仅仅提供了一个逻辑上的类的隔离空间,我们在引用类时,仍要自己实现自动载入。思路就是使用一个未引入的类时,php自动触发spl_autoload_register这个方法,然后就会根据命...
  • u012371137
  • u012371137
  • 2016-07-22 17:27:48
  • 3057

PHP5.6对命名空间的扩展,use可以导入函数与常量空间

php版本 > 5.60 1、解决命名冲突 2、导入类、函数、常量 3、赋予别名 test1.php namespace Demo1; class test1 ...
  • Baymax001
  • Baymax001
  • 2017-06-06 19:56:01
  • 708
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 4万+
    积分: 1160
    排名: 4万+
    博客专栏
    最新评论