博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php中命名空间和use
阅读量:6089 次
发布时间:2019-06-20

本文共 6795 字,大约阅读时间需要 22 分钟。

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文件中可以存在多个命名空间,第一个命名空间前不能有任何代码。内容空间声明后的代码便属于这个命名空间,例如:

 

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

'; } } function Person(){ return 'You must stay here!'; }; namespace Student; class Person{ function __construct(){ echo 'I want to play!
'; } } 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文件:

'; } }

 

 

 

'; } }

 

 

 

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

namespace School\Parents;    class Man{ function __construct(){ echo 'Listen to teachers!
'; } } namespace School\Teacher; class Person{ function __construct(){ echo 'Please study!
'; } } namespace School\Student; class Person{ function __construct(){ echo 'I want to play!
'; } } 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(); //报错

 

转载地址:http://qgpwa.baihongyu.com/

你可能感兴趣的文章
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>