php中命名空间和use

总结

php中的namespace就有点像java中package包的概念

php中的use的概念就是用别人的命名空间中的类

php中的include enquire是引入文件

use不等于require_once或者include,use的前提是已经把文件包含进当前文件

小实例

namespace app\index\controller;

定义了一个名为app\index\controller的命名空间,别人如果调用我这么命名空间下的Index类,需要这样写:user app\index\controller\Index;

use think\Db;

调用了名为think命名空间下的Db类

use think\Controller;

调用了名为think命名空间下的Controller类

详解

看.Net中的命名空间和using

using Ddd.Core;
using Ddd.Core.Caching; using Ddd.Core.Data; using Ddd.Core.Domain.Customers; using Ddd.Core.Domain.QiNiu; using Ddd.Services.Events; using System; using System.Collections.Generic; using System.Linq; namespace Ddd.Services.QiNiu

看Java中的命名空间和import

package demo.jq.com.relativelayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle;

看PHP中的命名空间和use

namespace app\admin\model;
use think\Model; use think\Db;

综上可以看出,命名空间就是相当于一个文件夹的路径。同一个命名空间下,不能有相同的类文件。同名的类文件可以存在于不同的命名空间下面。

用了命名空间,可以方便的调用其他文件夹下的文件。

只需要通过using、import、use引入命名空间下的文件即可。

然后就可以在方法中新建对象了。

use app\admin\model\LiveRecharge;
$LiveRecharge = new LiveRecharge();

看.Net或者Java,可以看出using、import可以引入一些系统自带的类文件。

模块用到哪个,引入相应的系统类即可。

Thinkphp5中使用了命名空间的机制,表面上看麻烦了,每个类都需要写命名空间,其实是方便了。

有了命名空间,能够更便捷的使用各个模块的类,可以方便的引入外部模块,可以方便的使用其他模块的Model,或者一些通用的类引入都便捷了。

让PHP更加的面向对象。

注意:use不等于require_once或者include,use的前提是已经把文件包含进当前文件。


1. namespace Zend\Http\PhpEnvironment;       

这句代码定义了一个命名空间,你可以理解为定义一个名称为 Zend\Http\PhpEnvironment 的域名。

在定义了之后,下面所申明的class, interface, const等都是在申明的这个“域”里面的。当引用一个申明了命名空间的包含文件,想要调用这个里面的东西,那就必须:

调整当前脚本也到这个域名里,否则,就得用namesapce的全称。

比如,inc.php 文件:

namespace Zend\Http\PhpEnvironment;class Bar {}//定义了一个类

则其他文件调用时:

// 访问Foo的第一种方法,用全称require 'inc.php';$foo = new \Zend\Http\PhpEnvironment\Bar();

// 访问Foo的第二种方法namespace Foo; // 调整当前脚本到Foo这个ns域,而且namespace申明必须在第一句require 'inc.php';$foo = new Bar();

2. use关键字目的是使用ns的别名:

比如说,上面的

// 访问Foo的第一种方法,用全称require 'inc.php';$foo = new \Zend\Http\PhpEnvironment\Bar();

用uses后,写法如下:

use \Zend\Http\PhpEnvironment as pe;   //定义别名

$foo = new \pe\Bar();                    //用短的别名来代替原来的

如果省略后面的as ....,那么,就可以直接用最后一节的文字来代替,比如,上面的:

use \Zend\Http\PhpEnvironment;   //定义别名$foo = new \PhpEnvironment\Bar();      //用短的别名来代替原来的

================================================

php官方手册中的相关内容:

在PHP中,namespace命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 

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

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。

PHP 命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名, 别名通过操作符 use 来实现

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。

举个栗子:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法,但是同时引入各自的Comment类显然是不行的,代码会出错,在另一个地方重写任何一个Comment也会降低维护性。那这时只能重构类名,我约定了一个命名规则,在类名前面加上模块名,像这样:Article_Comment、MessageBoard_Comment

可以看到,名字变得很长,那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且,以后如果要对各个模块增加更多的一些整合功能,或者是互相调用,发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题,并规定命名规则就能很好的避免这个问题。另一个解决方法可以考虑使用命名空间。

  

基础
命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。

创建一个命名空间需要使用namespace关键字,这样:

复制代码代码如下:

<?php

//创建一个名为'Article'的命名空间
namespace Article;

?>

要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:

复制代码代码如下:

//例一
//在脚本前面写了一些逻辑代码

<?php

$path = "/";

class Comment { }

namespace Article;

?>

//例二
//在脚本前面输出了一些字符

<html></html>
<?php

namespace Article;

?>

为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。

下面我创建了两个命名空间,顺便为这两个空间各自添加了一个Comment类元素:

复制代码代码如下:

<?php

//创建一个名为'Article'的命名空间
namespace Article;

//此Comment属于Article空间的元素
class Comment { }

//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;

//此Comment属于MessageBoard空间的元素
class Comment { }
?>

在不同空间之间不可以直接调用其它元素,需要使用命名空间的语法:

复制代码代码如下:

<?php

namespace Article;

class Comment { }

namespace MessageBoard;

class Comment { }

//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();

//调用Article空间的Comment类
$article_comment = new \Article\Comment();

?>

可以看到,在MessageBoard空间中调用article空间里的Comment类时,使用了一种像文件路径的语法: \空间名\元素名

除了类之外,对函数和常量的用法是一样的,下面我为两个空间创建了新的元素,并在MessageBoard空间中输出了它们的值。

复制代码代码如下:

<?php

namespace Article;

const PATH = '/article';

function getCommentTotal() {
    return 100;
}

class Comment { }

namespace MessageBoard;

const PATH = '/message_board';

function getCommentTotal() {
    return 300;
}

class Comment { }

//调用当前空间的常量、函数和类
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();

//调用Article空间的常量、函数和类
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();

?>

然后我的确得到了Article空间的元素数据。

子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。


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

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

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

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面是一个说明 PHP 命名空间语法的示例:

Example #1 命名空间语法示例

<?php
namespace my\name; // 参考 "定义命名空间" 小节

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // 参考 "全局空间" 小节

$a = strlen('hi'); // 参考 "使用命名空间:后备全局函数/常量" 小节

$d = namespace\MYCONST; // 参考 "namespace操作符和__NAMESPACE__常量” 小节

$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // 参考 "命名空间和动态语言特征" 小节
?>

Note:

名为PHPphp的命名空间,以及以这些名字开头的命名空间(例如PHP\Classes)被保留用作语言内核使用,而不应该在用户空间的代码中使用。


在PHP中,出现同名函数或是同名类是不被允许的。为防止编程人员在项目中定义的类名或函数名出现重复冲突,在PHP5.3中引入了命名空间这一概念。

1.命名空间,即将代码划分成不同空间,不同空间的类名相互独立,互不冲突。一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码。内容空间声明后的代码便属于这个命名空间,例如:

<?phpecho 111;       //由于namespace前有代码而报错namespace Teacher; class Person{ function __construct(){ echo 'Please study!'; } }

2.调用不同空间内类或方法需写明命名空间。例如:

<?phpnamespace Teacher;class Person{ function __construct(){ echo 'Please study!<br/>'; } } function Person(){ return 'You must stay here!'; }; namespace Student; class Person{ function __construct(){ echo 'I want to play!<br/>'; } } new Person(); //本空间(Student空间) new \Teacher\Person();   //Teacher空间 new \Student\Person(); //Student空间 echo \Teacher\Person(); //Teacher空间下Person函数 //输出: I want to play! Please study! I want to play! You must stay here!

3.在命名空间内引入其他文件不会属于本命名空间,而属于公共空间或是文件中本身定义的命名空间。例:

首先定义一个1.php和2.php文件:

<?php     //1.php
class Person{ function __construct(){ echo 'I am one!<br/>'; } }
<?php
namespace Newer;
require_once './1.php'; new Person(); //报错,找不到Person; new \Person(); //输出 I am tow!;
<?php     //2.php
namespace Two
class Person{function __construct(){ echo 'I am tow!<br/>'; } }
<?php
namespace New;
require_once './2.php'; new Person(); //报错,(当前空间)找不到Person; new \Person(); //报错,(公共空间)找不到Person; new \Two\Person(); //输出 I am tow!;

4.下面我们来看use的使用方法:(use以后引用可简写)

    namespace School\Parents;class Man{ function __construct(){ echo 'Listen to teachers!<br/>'; } } namespace School\Teacher; class Person{ function __construct(){ echo 'Please study!<br/>'; } } namespace School\Student; class Person{ function __construct(){ echo 'I want to play!<br/>'; } } new Person(); //输出I want to play! new \School\Teacher\Person(); //输出Please study! new Teacher\Person(); //报错 ---------- use School\Teacher; new Teacher\Person(); //输出Please study! ---------- use School\Teacher as Tc; new Tc\Person(); //输出Please study! ---------- use \School\Teacher\Person; new Person(); //报错 ---------- use \School\Parent\Man; new Man(); //报错

转载于:https://www.cnblogs.com/Renyi-Fan/p/8667521.html

php中命名空间和use相关推荐

  1. 请说明一下MyBatis中命名空间(namespace)的作用是什么?

    请说明一下MyBatis中命名空间(namespace)的作用是什么? 在大型项目中,可能存在大量的sql语句,这时候为每一个sql语句起一个唯一的标识ID就变得并不容易了,为了解决这个问题,在myb ...

  2. python的命名空间_python中命名空间的三种方式介绍(附示例)

    本篇文章给大家带来的内容是关于python中命名空间的三种方式介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. python中的命名空间分三种: 内置的命名空间,在启动解 ...

  3. php中命名空间、面向对象、访问控制、接口

    命名空间: php中命名空间:解决自己编写的代码和php内置及第三方的函数.常量.类命名冲突问题(在不同的命名空间可以定义相同名称的常量.类.函数):及为繁琐的命名创建一个别名,具体如下: //1.简 ...

  4. php中命名空间重要吗,关于php:PHP中命名空间是怎样的存在一

    命名空间其实早在PHP5.3就曾经呈现了.不过大部分同学可能在各种框架的应用中才会接触到命名空间的内容,当然,现代化的开发也都离不开这些可能疾速产出的框架.这次咱们不从框架的角度,仅从简略的代码角度来 ...

  5. 世界大学城空间代码_C++中命名空间的五大常见用法

    译者注:可能很多程序员对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命 ...

  6. C 中命名空间的五大常见用法

    译者注:可能很多程序员对C 已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c 标准中,通常是这样定义的: 命名空间 ...

  7. python中的命名空间指什么_python中命名空间

    原文章 由一个例子到python的名字空间 .这篇文章对python的命名空间做出了非常好的介绍,这里是我自己的一些理解. 例子1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. spring-mvc.xml与spring-mybatis.xml配置文件中命名空间问题

    首先贴出配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  9. C/C++中命名空间(namespace)详解及其作用介绍

    命名空间 (namespace) 可以帮助我们区分不同库中相同名称的函数, 类, 变量等. 使用了命名空间即定义了上下文. 命名空间就是定义了一个范围. 命名空间 为了解决 C++ 标准库中的标识符与 ...

最新文章

  1. 动态半导体ram依据什么存储信息_LPDDR4X和RAM两者有什么关系 它们有什么特点
  2. [Qt教程] 第46篇 进阶(六) 国际化
  3. golang new与make的一点区别理解
  4. “超大杯”版小米10不仅有120W超级快充,电池也要比传闻大
  5. python中string.digits_Python string.hexdigits方法代码示例
  6. C#中生成随机数的方法和语句
  7. 兆能Z82机顶盒-卡刷-刷机固件
  8. 项目实施计划及总体设计报告(大纲)
  9. python实现截图转文字功能
  10. 找不到网络其他计算机名,电脑找不到无线网名称怎么办?找不到无线网名称解决办法...
  11. java毕业设计网上租贸系统mybatis+源码+调试部署+系统+数据库+lw
  12. mysql 表继承_如何在数据库中表示继承?
  13. IOS成长之路-使用系统默认声音、震动
  14. python roundup 和 rounddown
  15. JSP 返回上一页的几种方法
  16. Map接口总结与HashMap源码分析
  17. 关于加强网络舆情监测的几点建议,TOOM强化舆情监控有方法
  18. 解决php7.2后报错Warning: Use of undefined constant PRE - assumed问题
  19. 云服务器怎么采购便宜?云服务器优惠 3 大准则
  20. 玩于鼓掌之中的小老虎机——Tiny Tiger Machine

热门文章

  1. 冬奥冠军武大靖也有减重烦恼,还为此发了篇论文
  2. 刑啊!智能音箱让10岁女童摸电门,内容来自网络却不审核,这锅该谁来背?...
  3. 中国首款L4级Robovan发布!文远知行商用落地两条腿走路
  4. 专访阿里达摩院聂再清:不能让每个人无差别享受AI,是程序员的耻辱
  5. 两年伯克利数学博士毕业,蝉联阿里数学竞赛金奖,张钺:我就是个普通人
  6. 一文看懂百度云智峰会:发布两大中台、八大方案,落地细节精准到发丝
  7. 火星直播?一种可以给中国火星探测工程当云监工的方法
  8. 十一.python面向对象(接口)abstractmethod,ABCMeta
  9. 小tips:你不知道的 npm init
  10. flutter 如何自定义一个loadmore / 加载更多