php namespace的使用介绍

C++命名空间namespace的使用规范 1.命名空间 namespacens { ………//将内容添加到命名空间中 } using namespace ns; ……..//声明命名空间后,表示ns命名空间里面的内容对于这条声明后的代码是可见的。 但是如果声明了两个命名空间ns1,ns2。且ns1和ns2中包含相同的全局变量,或函数或类,那么就可能会产生冲突。 using namespace ns1; u 阅读详情

##简介

对于命名空间,官方文档已经说得很详细http://www.php.net/manual/zh/language.namespaces.rationale.php,我在这里做了一下实践和总结。

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

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

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

注明:

本文提到的常量:PHP5.3开始const关键字可以用在类的外部。const和define都是用来声明常量的(它们的区别不详述),但是在命名空间里,define的作用是全局的,而const则作用于当前空间。我在文中提到的常量是指使用const声明的常量。

##namespace的使用

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

创建一个命名空间需要使用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空间的元素数据。

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

抱歉我忘了说,article和message board这两个模块其实都是处于同一个blog项目内。如果用命名空间来表达它们的关系,是这样:


<?php

 

//我用这样的命名空间表示处于blog下的article模块
namespace Blog\Article;

class Comment { }


//我用这样的命名空间表示处于blog下的message board模块
namespace Blog\MessageBoard;

class Comment { }

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

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

?>

而且,子空间还可以定义很多层次,比如说 Blog\Article\Archives\Date

公共空间 我有一个common_inc.php脚本文件,里面有一些好用的函数和类:


<?php

 

function getIP() { }

class FilterXSS { }

?>

在一个命名空间里引入这个脚本,脚本里的元素不会归属到这个命名空间。如果这个脚本里没有定义其它命名空间,它的元素就始终处于公共空间中:


<?php

 

namespace Blog\Article;

//引入脚本文件
include './common_inc.php';

$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog\Article\FilterXSS类

$filter_XSS = new \FilterXSS(); //正确

?>

调用公共空间的方式是直接在元素名称前加 \ 就可以了,否则PHP解析器会认为我想调用当前空间下的元素。除了自定义的元素,还包括PHP自带的元素,都属于公共空间。

要提一下,其实公共空间的函数和常量不用加 \ 也可以正常调用(不明白PHP为什么要这样做),但是为了正确区分元素,还是建议调用函数的时候加上 \

名称术语 在说别名和导入之前,需要知道关于空间三种名称的术语,以及PHP是怎样解析它们的。官方文档说得非常好,我就直接拿来套了。

1.非限定名称,或不包含前缀的类名称,例如 $comment = new Comment();。如果当前命名空间是Blog\Article,Comment将被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

2.限定名称,或包含前缀的名称,例如 $comment = new Article\Comment();。如果当前的命名空间是Blog,则Comment会被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new \Article\Comment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)Article\Comment。

其实可以把这三种名称类比为文件名(例如 comment.php)、相对路径名(例如 ./article/comment.php)、绝对路径名(例如 /blog/article/comment.php),这样可能会更容易理解。

我用了几个示例来表示它们:


<?php

 

//创建空间Blog
namespace Blog;

class Comment { }

//非限定名称,表示当前Blog空间
//这个调用将被解析成 Blog\Comment();
$blog_comment = new Comment();

//限定名称,表示相对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new Article\Comment(); //类前面没有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Comment();
$article_comment = new \Blog\Comment(); //类前面有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\


//创建Blog的子空间Article
namespace Blog\Article;

class Comment { }

?>

其实之前我就一直在使用非限定名称和完全限定名称,现在它们终于可以叫出它们的名称了。

别名和导入 别名和导入可以看作是调用命名空间元素的一种快捷方式。PHP并不支持导入函数或常量。

它们都是通过使用use操作符来实现:


<?php

 

namespace Blog\Article;

class Comment { }


//创建一个BBS空间(我有打算开个论坛)
namespace BBS;

//导入一个命名空间
use Blog\Article;
//导入命名空间后可使用限定名称调用元素
$article_comment = new Article\Comment();

//为命名空间使用别名
use Blog\Article as Arte;
//使用别名代替空间名
$article_comment = new Arte\Comment();

//导入一个类
use Blog\Article\Comment;
//导入类后可使用非限定名称调用元素
$article_comment = new Comment();

//为类使用别名
use Blog\Article\Comment as Comt;
//使用别名代替空间名
$article_comment = new Comt();

?>

我注意到,如果导入元素的时候,当前空间有相同的名字元素将会怎样?显然结果会发生致命错误。

例:


<?php

 

namespace Blog\Article;

class Comment { }


namespace BBS;

class Comment { }

Class Comt { }


//导入一个类
use Blog\Article\Comment;
$article_comment = new Comment(); //与当前空间的Comment发生冲突,程序产生致命错误

//为类使用别名
use Blog\Article\Comment as Comt;
$article_comment = new Comt(); //与当前空间的Comt发生冲突,程序产生致命错误

?>

动态调用 PHP提供了namespace关键字和__NAMESPACE__魔法常量动态的访问元素,__NAMESPACE__可以通过组合字符串的形式来动态访问:


<?php

 

namespace Blog\Article;

const PATH = '/Blog/article';

class Comment { }


//namespace关键字表示当前空间
echo namespace\PATH; ///Blog/article
$comment = new namespace\Comment();

//魔法常量__NAMESPACE__的值是当前空间名称
echo __NAMESPACE__; //Blog\Article
//可以组合成字符串并调用
$comment_class_name = __NAMESPACE__ . '\Comment';
$comment = new $comment_class_name();

?>

字符串形式调用问题

上面的动态调用的例子中,我们看到了字符串形式的动态调用方式,如果要使用这种方式要注意两个问题。

  1. 使用双引号的时候特殊字符可能被转义

<?php

 

namespace Blog\Article;

class name { }

//我是想调用Blog\Article\name
$class_name = __NAMESPACE__ . "\name"; //但是\n将被转义为换行符

$name = new $class_name(); //发生致命错误

?>

  1. 不会认为是限定名称

PHP在编译脚本的时候就确定了元素所在的空间,以及导入的情况。而在解析脚本时字符串形式调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称。


<?php

namespace Blog;

//导入Common类
use Blog\Article\Common;
//我想使用非限定名称调用Blog\Article\Common
$common_class_name = 'Common';
//实际会被当作非限定名称,也就表示当前空间的Common类,但我当前类没有创建Common类
$common = new $common_class_name(); //发生致命错误:Common类不存在

//我想使用限定名称调用Blog\Article\Common
$common_class_name = 'Article\Common';
//实际会被当作完全限定名称,也就表示Article空间下的Common类,但我下面只定义了Blog\Article空间而不是Article空间
$common = new $common_class_name(); //发生致命错误:Article\Common类不存在


namespace Blog\Article;

class Common { }

?>

C#命名空间详解namespace   命名空间是一个域,这在个域中所有的类型名字必须是唯一的,不同的类型分组归入到层次化的命名空间, 命名空间的好处是:1、避免名字冲突,2、便于查找类型名字。 如:System.secruity.Cryptogtaphy. 下面介绍namespace 关键字的使用。 namespace test {   class class0   {     int i;     publi... 阅读详情

相关推荐

PHP - 命名空间(namespace)概述及实例说明

https://www.php.net/manual/zh/language.namespaces.rationale.php

🏆 前端领域优质创作者 3337

PHP 命名空间(namespace)

在 PHP 文件的顶部,使用namespace关键字来定义命名空间。1在命名空间中定义类、函数或常量。123456789// 类的定义// 函数的定义。

w3school52的博客 1579

PHP:namespace 关键字和 __NAMESPACE__ 常量

PHP:namespace 关键字和 __NAMESPACE__ 常量

希望我的博客,能帮上你解决学习中工作中所遇到的问题 397

PHP命名空间(Namespace)的使用详解

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

万里船的专栏 1499

DETRs with Collaborative Hybrid Assignments Training论文阅读与代码

在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习,反之亦然,也会影响解码器中的注意力学习。为了缓解这个问题,作者提出了一种新颖的协同混合分配训练方案,名为Co-DETR,以从多样的标签分配方式中学习更高效、更有效的基于DETR的检测器。这种新的训练方案可以通过训练多个并行辅助 Head ,以一对多的标签分配方式(如ATSS和Faster RCNN)进行监督,轻松增强端到端检测器中编码器的学习能力。

qingjing0413的博客 1156

基于FPGA的工业相机项目大赏1——cmos线阵相机

●CMOS CL0402 作为图像传感芯片,曝光后产生一定格式的图像数据;●FPGA ZYNQ7020 作为主控芯片负责cmos驱动控制、图像像素的采集、cmos寄存器的配置、cameralink协议的实现、上位机串口通信的实现;●Cameralink端子实现图像数据的高速串行发送,将数据传送至采集卡PC端。系统工作流程如下: FPGA 上电加载配置程序,计算机通过异步串口向 FPGA 发送控制信息,FPGA对接收的控制信息进行分析判断。

weixin_41895751的博客 6400

php namespace 包含 变量_PHP基本语法介绍

一、基础 PHP 语法PHP 脚本可放置于文档中的任何位置。PHP 脚本以 <?php 开头,以 ?> 结尾:PHP 文件的默认文件扩展名是 ".php"。PHP 文件通常包含 HTML 标签以及一些 PHP 脚本代码。下面的例子是一个简单的 PHP 文件,其中包含了使用内建 PHP 函数 "echo" 在网页上输出文本 "Hello World!" 的一段 PHP 脚本:实例注释:P...

weixin_39888018的博客 175

【SAP报错】BK128&K5112

在ECC中使用CO1F进行Progressive confirmation时,依次遇到了如下的报错。

weixin_45228526的博客 784

PHP namespace、abstract、interface、trait使用介绍

小菜鸟一枚,一直搞不懂 namespace、abstract、interface、trait 这些关系,就抽出几天时间研究,做个总结,不足之处希望大家指正交流。 namespace 命名空间 介绍:顾名思义,就是给空间命名。其实最简单的可以把每个文件夹都理解为一个空间,然后我们给这个空间一个定义(namespace),让其成为正式空间。当然并不是说一个文件夹就需要一个空间(最好是),在同一个文...

weixin_30295091的博客 180

从法律文档到知识图谱

这里我们定义了两个 Pydantic 模型:Location 用于捕捉结构化的地址信息,包含可选的国家、州和地址字段;Party 用于表示合同参与方,包含必填的名称和可选的位置详情。字段描述通过告知 LLM 每个字段具体需要查找哪些信息,来辅助提取过程。"""包含结构化地址组件的位置信息。"""country: Optional[str] = Field(None, description="国家")

Anspire的博客 3030

Python+Selenium实战:5分钟搞定快手评论区数据采集(附完整代码)

本文详细介绍了如何使用Python和Selenium快速采集快手评论区数据,提供完整的代码实现和优化方案。通过动态加载处理和智能等待策略,5分钟内即可构建高效的评论采集工具,适用于用户行为分析和内容挖掘等场景。

weixin_30415113的博客 344

PHP——命名空间(namespace)使用详细介绍

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结。 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有...

mysteryflower的专栏 384

保姆级教程:用BMS的HVIL检测电路,手把手教你排查高压互锁故障(附PWM/直流源方案对比)

本文详细解析了BMS中的HVIL检测电路,通过对比直流源与PWM两种方案,提供了一套系统化的高压互锁故障诊断流程。从电路原理到实战技巧,帮助维修人员精准定位故障根源,提升电动汽车高压系统的安全性和可靠性。

weixin_29300241的博客 392

PHP namespace(命名空间) 和 use; 很多人搞不清楚命名空间和使用方法,书上介绍也不清楚看着头大

比如,test_1.php里有个test类,test_2.php文件里也有一个test类,如果一个文件同时引入了这两个文件时,在PHP 5.2版本以前就会报错,那么,大家的做法就是把相应重名类改为不重名类,方可使用,但是一旦项目非常大,文件非常多的时候,显然是这不利于管理的,于是引入了namespace这个概念,用来圈定相同名字的类属于不同的区域。使用namespace关键字的话,我们就可以达到效果:项目变得大型后,不同的模块有着相同的类的名称时,不会报错。现在要找某人的苹果,就将某人的命名空间带上,...

cdcdhj的博客 525

遗传算法(GA)全面解析:从生物基础到工程实践

本文全面解析了遗传算法(GA),从其生物基础到工程实践应用。遗传算法模拟自然进化过程,通过选择、交叉和变异等操作在解空间中高效搜索最优解。文章详细介绍了算法的生物学基础(达尔文进化论、孟德尔遗传定律)、基本概念(种群、个体、基因等)和核心思想。重点阐述了遗传算法的数学模型,包括编码机制、适应度函数设计、遗传算子(选择、交叉、变异)以及关键控制参数。最后提供了一个完整的Python实现示例,展示了遗传算法求解函数最大值问题的具体应用。该算法具有群体搜索、概率导向、无需梯度等特点,适用于各类复杂优化问题。

qq_42212808的博客 1176

B站评论情感分析实战:Python批量爬取+BERT正负向分类,精准度92%(附完整代码)

用技术手段自动化挖掘用户真实情感,比人工分析更高效、更客观。这套方案的精度能稳定在90%左右,完全满足实际应用需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1026

PHP的namespace

PHP的namespace

duke_ding2的博客 1101

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

yaf namespace的使用

yaf支持namespace。在php.ini 中添加 yaf.namespace=1 就可以启动namespace 但是如果开了namespace就不能再使用非namespace的写法了。 <?php define('ROOT_PATH', realpath(dirname(dirname(__FILE__)))); define('APPLICATION_PATH', ROOT_P

莫冲的专栏 3574

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

命名空间的namespace关键字和__NAMESPACE__常量

PHP支持两种抽象的访问当前命名空间内部元素的方法, __NAMESPACE__ 魔术常量和namespace关键字。 常量 __NAMESPACE__ 的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。 Example #1 __NAMESPACE__ 示例, 在命名空间中的代码 <?php namespace MyProject ; e...

qq839534800的博客 357

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入);那么什么是命名空间呢?php官网已很明确的进行了定义并形象化解释,这里直接从php官网copy一段文字[来源]。 “什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文

dahuzi的专栏 1万+

PHP & 理解 Namespace (命名空间)

前言 假设我们有 Tools/A/Foo.php 、Tools/B/Foo.php 文件,这两个 Foo.php 定义了同一个类,然后从 C.php 引入这两个文件,大家说会出现什么情况?代码如下 # Tools/A/Foo.php class Foo{ public function __construct() {} public function say() { echo "Hello,world"; } } # Tools/B/Foo.php class Foo{ public funct

Thinking anywhere anytime. 491

php里的namespace及use的用法

namespace及use的用法 标签: namespacephpuse 2013-01-26 10:50 8220人阅读 评论(0) 收藏 举报 namespace(以下简称ns)。在定义了一个ns之后,下面所申明的class、interface、const(不包含variable)都是在申明的ns这个“域”里面的。当引用一个申明了ns的包含文件,想要调

Rachel Wang的little tree 362

【亲测免费】 PHP 命名空间解析器(PHP Namespace Resolver)教程

PHP 命名空间解析器(PHP Namespace Resolver)教程 项目介绍 PHP Namespace Resolver 是一个专为 Visual Studio Code 打造的扩展插件,由 Mehedi Hassan 开发并维护。此工具极大地简化了在 PHP 项目中导入和管理命名空间的过程。通过快捷方式或命令面板,开发者可以自动地将类的命名空间添加到文件顶部,排序已导入的类以及执行其他...

gitblog_00477的博客 898

namespace命名空间学习

1. namespace是什么? 命名空间是namespace是翻译,作用是防止类名或函数名重复,命名重复会导致报错。以前没有命名空间的时候只能人为去防止重复,但项目上了一定规模难以避免这个问题,因此,在php5.3版本推出了namespace。 2. namespace的简单使用 使用比较简单,下面举个例子 1. 先是不用namespace的方式 Foo.php <?php class Test { public static function index(){ echo 'hello wor

大智若愚的博客 690

Namespace declaration statement has to be the very first statement in the script

php 中  Namespace declaration statement has to be the very first statement in the script 错误解决方法: 在PHP文件中编写有namespace 时候提示此错误,应该将    开始前面不能有语句,空行也不行。 如果是在含有语言的混合php 文件里面,且文件里面至少有一个代码段时候,只要用到na

yhb598712254的专栏 8万+
上一篇: php常量介绍
下一篇: Mysql查询字段包含某个字符串的方法
CSTO
博客等级 码龄17年 3粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值