广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP关键特性之命名空间的示例分析
  • 827
分享到

PHP关键特性之命名空间的示例分析

2023-06-15 06:06:25 827人浏览 安东尼
摘要

这篇文章主要介绍PHP关键特性之命名空间的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,php则是姗姗来迟,它的出

这篇文章主要介绍PHP关键特性之命名空间的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,php则是姗姗来迟,它的出现催生了 PSR-4 的诞生,从而也催生了 Composer 的兴起,所以是非常重要的特性。

命名空间的定义

命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行。

对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP 文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间。

假如编写的代码没有定义命名空间,那说明它属于全局的命名空间(\ 符号),所以能够直接引用类或者函数(不用添加 \ 符号)。

引用命名空间标识符的三种方式

(1)Fully-qualified name

类似于操作系统上的绝对路径,而且是完整的路径,所以在理解的时候不会有误解。
比如在 new \A\B\C ,那么 C 就被会解析到 A\B 命名空间下的 C 类。

(2)Qualified name

类似于操作系统上的相对路径,它包含部分名字并被引用到当前的命名空间。
比如 B\C() 在命名空间 A 下调用,则最终引用的命名空间就是 A\B\C()。

(3)Unqualified name

类似于Qualified name,但是没包括子命名空间。
比如 C() 在命名空间 A\B 下调用,则最终引用的命名空间就是 A\B\C()。

通过一个例子来说明三种引用方式:

namespace \Example;require_once "fnction.php";class ClassA {}function Function() {}//完全限定名称\Example\Function();\Example\B\Function(); //限定名称B\Function(); //指向 \Example\B\Function();//非限定名称$test = new ClassA(); //resolves to \Example\ClassAFunction(); //指向 \Example\Function

注意:

  • Inside a namespace,假如在 current scope 没有发现函数和常量的定义,PHP 不会报错。而是去全局命名空间中寻找。

  • Inside a namespace,假如在 current scope 没有发现类的定义,则 PHP 会直接报错,不会去全局域中找对应的类,所以假如你需要引用一个 internal 或用户自定义的类,必须使用完全限定名称。

先举个简单的例子,首先编写一段代码(定义在命名空间下),命名为 function.php :

namespace Foo\Bar\subnamespace;const FOO = 1;function foo() {    return "foo\r\n";}class foo {    static function staticmethod()    {        return __METHOD__ . "\r\n" ;    }    function foofunction()    {        return __METHOD__ . "\r\n" ;    }}

再编写一段代码 test.php,也是处于命名空间之下的代码:

namespace secondsp;include 'function.php';class foo{    function foofunction()    {        return __METHOD__ . "\r\n" ;    }}function is_file($file){    return true ;} //非限定名称:实例化secondsp\foo类对象$obj = new foo;  echo $obj->foofunction();//实例化Foo\Bar\subnamespace\foo 类对象$obj = new Foo\Bar\subnamespace\foo ;echo $obj->foofunction();//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错//$obj = new ArrayObject(array(1)); $obj = new \ArrayObject(array(1)); //在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native functionecho  strlen("nihao"); //引用当前命名空间下的函数var_dump(is_file('nihao')); //True//引用全局函数var_dump(\is_file('nihao')); //False
导入,别名

假如要使用的命名空间层级很长且数量很多,那么在使用的时候特别麻烦,所以可以使用 use 关键字导入命名空间、类、常量、函数等,然后可以使用它们直接引用完整的名称。而 alias 关键字可以给导入的类和函数等重命名。

举个例子如何使用 use 关键字,该代码处于全局命名空间之下:

include 'function.php';use Foo\Bar\subnamespace\foo ;$obj = new foo;echo $obj->foofunction();use Foo\Bar\subnamespace\foo  as aliasfunname;$obj = new aliasfunname;echo $obj->foofunction(); use Foo\Bar\subnamespace ; $obj = new subnamespace\foo ;echo $obj->foofunction();use Foo\Bar\subnamespace  as aliasname;$obj = new aliasname\foo ;echo $obj->foofunction();//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用$obj = new ArrayObject(array(1)); //导入一个函数use function Foo\Bar\subnamespace\foo   ;echo foo(); use function Foo\Bar\subnamespace\foo  as func;echo func(); use const  Foo\Bar\subnamespace\FOO;//echo FOO;

总结:

  • python 不一样,PHP 中的命名空间是语义上的一种概念,和具体代码的位置、布局没有关系,换句话说,使用命名空间的代码需要自己引入库文件(所有文件),至于库文件如何组织无所谓;而在 Python 中,假如模块或包中有一个 __init__.py 文件,则 Python 解析器会自动引入包或所有模块的文件。

  • PHP 中作用域的概念很弱化,全局域和局部域分的很清楚,比如在函数或类中无法引用全局空间中的变量。而在命名空间则不同,定义命名空间的代码,假如找不到对应命名空间下的常量和函数,则会使用全局的常量和函数;而假如找不到对应名命名空间下的类(包括自定义类),则代码直接报错。

  • 通过 use 关键字使用命名空间的,无须通过完全限定名称的方式(\ 符号)导入,因为 PHP 已经假设导入的是完全限定的命名空间。

  • 通过 use 关键字可以导入常量、函数、类、接口、其他命名空间。

  • 命名空间是一种语言特性,为了追求更有效的使用,应该有一种使用规范和自动加载机制,这就是 PSR-4 规范。

以上是“PHP关键特性之命名空间的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP关键特性之命名空间的示例分析

本文链接: https://www.lsjlt.com/news/278431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP关键特性之命名空间的示例分析
    这篇文章主要介绍PHP关键特性之命名空间的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出...
    99+
    2023-06-15
  • PHP核心特性命名空间的示例分析
    小编给大家分享一下PHP核心特性命名空间的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!提出PHP 在 5.3 后提出了命名空间用来解决组件之间的命名冲突问题,主要参考了文件系统的设计:同一个目录下不允许有相同的文...
    99+
    2023-06-15
  • namesapce命名空间的示例分析
    这篇文章主要介绍了namesapce命名空间的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.命名空间的使用目的   在PHP中函数、类、常量是不允许同名...
    99+
    2023-06-06
  • Flex命名空间的示例分析
    这篇文章主要介绍了Flex命名空间的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex命名空间详解通过命名空间可以控制所创建的属性和方法的可见性。请将public...
    99+
    2023-06-17
  • JavaScript命名空间模式的示例分析
    这篇文章将为大家详细讲解有关JavaScript命名空间模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:前言命名空间可以被认为是唯一标识符下代码的逻...
    99+
    2022-10-19
  • ES6新特性之let和const命令的示例分析
    这篇文章主要介绍了ES6新特性之let和const命令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1. let 命令①...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作