首页 后端开发 php教程 PHP中命名空间这部分内容的详解

PHP中命名空间这部分内容的详解

Aug 03, 2018 pm 02:45 PM
命名空间 空间

这篇文章给大家介绍的内容是关于PHP中命名空间这部分内容的详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

PHP的命名空间(namespace)是php5.3之后才有的。这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的。

为什么php中要使用namespace?

假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。

引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。

namespace的定义和使用

定义:

<code class="php"><?php<br/><br/>namespace Myproject;</code>
登录后复制

或者

<code class="php"><?php<br/><br/>namespace Myproject {<br/><br/>}</code>
登录后复制

使用:

<code class="php"><?php<br/><br/>use Myproject/School;</code>
登录后复制
<code class="php"><?php<br/><br/>use Myproject/School as School1;   // 别名</code>
登录后复制

命名空间是运行时解析的。use就相当于一种声明,并不解析和加载。比如下面这个例子:

test.php

<code class="php"><?php<br/>use my\name;<br/>require_once("/home/yejianfeng/handcode/test/namespace1.php");<br/>$a = new my\name\A();<br/>$a->Print1();</code>
登录后复制

namespace1.php

<code class="php"><?php<br/>namespace my\name;<br/>class A {<br/>        public function Print1(){<br/>                echo 11;<br/>        }<br/>}</code>
登录后复制

虽然require_once在use下面,也是可以正常运行的,因为程序只有在new my\name\A()的时候才去加载命名空间my\name

全局类和命名空间类

如果要new一个全局类使用 new \A()

如果要new一个命名空间类,使用new my\namespace\A()

命名空间的顺序

自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。

如果能弄清楚manual中的这个例子就能全部弄清楚寻找顺序了。

<code class="php"><?php<br/>namespace A;<br/>use B\D, C\E as F;<br/><br/>// 函数调用<br/><br/>foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()<br/>            // 再尝试调用全局函数 "foo"<br/><br/>\foo();     // 调用全局空间函数 "foo" <br/><br/>my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" <br/><br/>F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" <br/>            // 再尝试调用全局函数 "F"<br/><br/>// 类引用<br/><br/>new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "A\B"<br/><br/>new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "B\D"<br/><br/>new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "C\E"<br/><br/>new \B();   // 创建定义在全局空间中的类 "B" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "B"<br/><br/>new \D();   // 创建定义在全局空间中的类 "D" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "D"<br/><br/>new \F();   // 创建定义在全局空间中的类 "F" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "F"<br/><br/>// 调用另一个命名空间中的静态方法或命名空间函数<br/><br/>B\foo();    // 调用命名空间 "A\B" 中函数 "foo"<br/><br/>B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法<br/>            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"<br/><br/>D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法<br/>            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"<br/><br/>\B\foo();   // 调用命名空间 "B" 中的函数 "foo" <br/><br/>\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法<br/>            // 如果类 "B" 未找到,则尝试自动装载类 "B"<br/><br/>// 当前命名空间中的静态方法或函数<br/><br/>A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法<br/>              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"<br/><br/>\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法<br/>              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"<br/>?></code>
登录后复制

相关文章推荐:

php变量的命名规则以及php变量的用法(附代码)

php如何利用32进制实现对id的加密解密(附代码)

以上是PHP中命名空间这部分内容的详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

机器学习基础之数字上的距离:点在空间中的距离 机器学习基础之数字上的距离:点在空间中的距离 Apr 11, 2023 pm 11:40 PM

本文转载自微信公众号「活在信息时代」,作者活在信息时代。转载本文请联系活在信息时代公众号。在机器学习中,一个基础的概念就是如何判断两个样本之间的差异,从而能够评价两个样本之间的相似性和类别等信息。而判断这种相似性的度量就是两个样本在特征空间内的距离。根据数据特征的不同,度量方法有很多种。一般而言,对两个数据样本x,y,定义一个函数d(x,y),如果定义其为两个样本之间的距离,那么d(x,y)则需要满足以下几条基本性质:非负性:d(x,y)>=0同一性:d(x,y)=0 ⇔ x=y对

如何在 Ubuntu 上添加交换空间 22.04 LTS 如何在 Ubuntu 上添加交换空间 22.04 LTS Feb 20, 2024 am 11:12 AM

交换空间在Linux系统中扮演着重要角色,特别是在系统内存不足时。它充当着一个备用的内存存储空间,可以帮助系统平稳运行,即使在负载高的情况下也能保持稳定性。本文为您提供了在Ubuntu22.04LTS上添加交换空间的详细指南,以确保您的系统性能得到优化并能应对各种工作负载。了解交换空间交换空间提供虚拟内存,用于补充系统的物理RAM。当系统的RAM不足时,内核会将数据交换到磁盘,以防止内存不足和系统崩溃。Linux系统常用交换空间来处理这种情况。同时运行多个内存密集型应用程序处理非常大的文件或数据

解决PHP报错:未找到指定的命名空间类 解决PHP报错:未找到指定的命名空间类 Aug 18, 2023 pm 11:28 PM

解决PHP报错:未找到指定的命名空间类在使用PHP进行开发时,我们经常会遇到各种各样的报错信息。其中一种常见的报错就是“未找到指定的命名空间类”。这个错误通常是由于引入的类文件没有被正确地命名空间引用所引起的。本文将介绍如何解决这个问题,并提供一些代码示例。首先,让我们看一下一个常见的报错信息示例:Fatalerror:UncaughtError:C

c盘剩余空间多大合适 c盘剩余空间多大合适 Jun 27, 2023 pm 02:51 PM

c盘剩余空间50-80G比较合适。由于系统在日后使用当中会产生垃圾文件,缓存文件等因此建议至少预留50GB-80GB的空间给C盘;如果您不习惯在安装软件时选择路径,日常也不是经常清理电脑,那么至少需要100GB。

如何在F3框架中使用命名空间(Namespace)? 如何在F3框架中使用命名空间(Namespace)? Jun 03, 2023 am 08:02 AM

F3框架是一款简单易用,灵活可扩展的PHPWeb框架,它的命名空间(Namespace)机制为我们提供了一个更加规范、可读性更强、代码结构更为清晰的编程方式。在这篇文章中,我们将探讨如何在F3框架中使用命名空间。一、什么是命名空间命名空间常被用于解决在PHP中命名冲突的问题,它可以将一个或多个类、函数或常量封装在一个命名空间中,相当于给它们加上一个前缀。例

升级win11需要的C盘空间介绍 升级win11需要的C盘空间介绍 Dec 23, 2023 am 08:57 AM

众所周知,如果系统安装完成后占用系统盘太大,可能会导致系统运行卡顿、延迟,甚至是文件丢失。因此大家在安装win11系统之前,需要了解升级win11需要多大C盘空间,下面就跟着小编一起来看看吧。升级win11需要多大C盘空间:答:升级win11需要20-30GB的C盘空间。1、根据微软的win11配置要求可以看到,win11安装需要64GB的硬盘空间。2、但其实一般来说是不需要这么大的空间的。3、根据已经安装win11的用户反馈,win11升级大概需要20-30GB的C盘空间。4、但是如果我门只有

Redis的命名空间和过期机制的设计思路和实现方式 Redis的命名空间和过期机制的设计思路和实现方式 May 11, 2023 am 10:40 AM

Redis是一个开源的高性能的键值存储数据库。在使用Redis进行数据存储的时候,我们需要考虑到键的命名空间与过期机制的设计,来维护Redis的性能和数据完整性。本文将介绍Redis的命名空间和过期机制的设计思路和实现方式。一、Redis的命名空间设计思路在Redis中,键是可以任意设置的。为了方便管理和区分不同的数据类型,Redis引入了命名空间的概念。命

iOS 17.2:如何在 iPhone 15 Pro 上录制空间视频 iOS 17.2:如何在 iPhone 15 Pro 上录制空间视频 Dec 15, 2023 pm 01:09 PM

如果您使用的是iPhone15或iPhone15ProMax,iOS17.2允许您录制空间视频,以便在Apple即将推出的VisionPro耳机上的照片应用程序中查看。这是你如何做到的。Apple的VisionPro耳机预计将于2024年&lt;&gt;月左右发布。在那之前,您可以为此做好准备的一种方法是使用iPhone以一种称为空间视频的特殊格式录制视频,该格式可在Apple的耳机上观看。在iPhone上观看时,空间视频显示为普通视频,但它们在VisionPro上提供了近乎三维

See all articles