PHP命名空间

栏目: PHP · 发布时间: 5年前

内容简介:PHP命名空间类似于操作系统中的目录,如在D盘不能存在两个同名的文件,但是可以先创建两个不同名称的文件夹,然后将两个同名的文件,分别放到两个不同的文件夹中,就没有问题了。这里的目录就相当于命名空间。一旦将文件放入文件夹中,在访问此文件时,就必须加路径中加入此文件夹的名称,如 D:\1219\psb.jpgPHP中也不允许出现两个重名的类、函数或者常量,否则会产生一个致命错误。

1. 概念

PHP命名空间类似于操作系统中的目录,如在D盘不能存在两个同名的文件,但是可以先创建两个不同名称的文件夹,然后将两个同名的文件,分别放到两个不同的文件夹中,就没有问题了。这里的目录就相当于命名空间。

一旦将文件放入文件夹中,在访问此文件时,就必须加路径中加入此文件夹的名称,如 D:\1219\psb.jpg

PHP中也不允许出现两个重名的类、函数或者常量,否则会产生一个致命错误。

<?php
class Student{
    public $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
}
class Student{
    public $age;
    public function __construct($age)
    {
        $this->age=$age;
    }
}
$s=new Student("参数");

运行代码

Fatal error: Cannot declare class Student, because the name is already in use in  D:\phpStudy\WWW\test\test.php on line  9

为了避免重名,除了可以在名称前面加上前缀之外,更加推荐的方法就是使用命名空间,将相同名称的类、函数或者常量放到不同的命名空间中。

2. 创建命名空间语法

创建命名空间使用 namespace 关键字,上面的问题通过如下改造就不会报错了

namespace blog1;
class Student{
    public $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
}
namespace blog2;
class Student{
    public $age;
    public function __construct($age)
    {
        $this->age=$age;
    }
}
$s=new Student("参数");
echo $s->age;

上面代码创建了两个命名空间,名称分别为blog1和blog2。

注意每个命名空间的范围:命名空间的范围是从定义语句开始一直到下一个命名空间定义语句结束。

所以下面的代码仍然处于命名空间blog2中,所以这里的Student使用的是blog2下的Student

$s=new Student("参数");

如果想使用blog1中的Student类,就要使用下面的语法, \命名空间 名称\元素名称

$s=new \blog1\Student("参数");
echo $s->name;

思考:为什么这么写?

因为当前还在blog2空间下,要使用其他空间的类,就只能这么写

命名空间中,除了类,还可以拥有常量和函数,使用方法与类是一样的,这里不再赘述

3. 全局空间

全局空间也成为公共空间,即不属于我们定义的任何一个空间,公共空间的类、方法和常量,在任何一个命名空间中都可以使用。

上面用于访问另一个空间的符号“\”,也可用于访问全局空间元素

如下面代码在自己的命名空间中定义了一个与系统函数重名的函数,如果想使用系统的函数,就必须使用“\”

namespace blog3;
//如果不将此函数定义到blog3命名空间中,会报错的,因为与系统函数名称冲突
function var_dump($data){
    echo $data;
}
//这里调用的是blog3命名空间中的var_dump函数
var_dump("hello");
echo "<br>";
//这里调用的是系统的函数
\var_dump("hello");

除了系统函数属于全局空间,我们自定义的函数,如果不属于任何空间,也属于公共空间

新建 common.php,编写如下代码

function say($data){
    echo "hello".$data;
}

然后在其他文件中引入此文件,并调用 say 函数

require_once 'common.php';
\say("小明");

说明:也可以不使用“\”,但是为了规范,建议还是加上

4. 子空间

在文件系统中,一个目录下面还可以有目录,命名空间也是如此,命名空间下面还可以空间,叫做子空间

子空间是在实际的项目需求中需要的,这点MVC时就会看到

namespace blog4;
namespace blog4\controller;
function f1(){
    echo "blog4\controller";
}
namespace blog4\model;
function f1(){
    echo "blog4\model";
}
namespace blog\view;
function f1(){
    echo "blog4\\view";
}
//调用命名空间 blog4\view
f1();
//调用命名空间 blog4\controller
\blog4\controller\f1();
//调用命名空间 blog4\model
\blog4\model\f1();

5. 使用命名空间

这里要说明的如何使用其他命名空间中的类、函数和常量,换句话说就是如何使用路径

5.1 非限定名称

就是在使用类等元素时不使用前缀,而是直接使用元素名称,如类名、函数名称、常量名称

namespace blog1;
class beauty{
    public function __construct()
    {
        echo "beauty";
    }
}

/**
 * 在当前命名空间下使用本空间的类,可以直接使用类的名称
 * 前面不需要加入命名空间前缀
 */
$b=new beauty();

5.2 限定名称

包含前缀的名称,类似于相对路径,是相对于当前的命名空间定位的,主要适合于使用当前命名空间的子空间中的类等元素。

新建一个文件,命名为namespace.php

namespace blog1\controller;
class beauty{
    public function __construct()
    {
        echo "controller/beauty";
    }
}

然后在父空间所在目录编写如下代码

namespace blog1;
class beauty{
    public function __construct()
    {
        echo "beauty";
    }
}
require_once './namespace.php';

/**
 * 在当前命名空间下使用子空间中的类,需要在类名前面加上子空间名称前缀
 * 最终的路径如下 blog1\controller\beauty
 */
$b=new controller\beauty();

5.3 完全限定名称

包含了全局前缀操作符,相当于绝对路径

比如上面的代码,使用子空间中的类时,还可以写成这样

$b=new \blog1\controller\beauty();

注意,完全限定名称与限定名称之间的区别在于前面是否加上“\”操作符


以上所述就是小编给大家介绍的《PHP命名空间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入应用C++11

深入应用C++11

祁宇 / 机械工业出版社 / 2015-5 / 79

在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的现代编程语言的特性,相比C++98/03,它在生产力、安全性、性能和易用性上都有了大幅提高。比如auto和decltype让我们从书写冗长的类型和繁琐的类型......一起来看看 《深入应用C++11》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具