在WordPress插件中使用命名空间和自动加载,第3部分

在本教程中,我们将暂停编写代码,并了解什么是PHP名称空间和自动加载器,它们如何工作以及它们为何有益。 然后,我们准备通过在代码中实现它们来结束本系列文章。

如果您现在还不了解本系列文章中介绍的所有内容,那么我建议您回顾一下到目前为止的内容。 至少,请回顾上一篇文章,因为它将为我们在接下来的两篇文章中讨论的内容奠定基础。

现在您已经了解了,您将了解我们一直在使用的插件,其功能以及工作方式。 此外,您应该建立一个本地开发环境,以允许您使用源代码。 如果没有,这是您需要的所有东西的简要清单:

  • 一个本地开发环境,包括PHP 5.6.20,Apache Web服务器和MySQL数据库服务器。
  • WordPress 4.6所在的目录。
  • 您很喜欢使用文本编辑器或IDE来编写插件。
  • WordPress插件API的使用知识。

假设您已经安装,设置了所有这些功能,并准备将其与最新版本的插件一起使用,那么我们就可以继续进行有关命名空间,自动加载和WordPress插件的讨论。

关于命名空间和自动加载

对于那些使用其他现代编程语言工作的人,您可能熟悉名称空间的概念。 但是,即使您使用过PHP,也不太可能看到它们,至少在WordPress中是如此。

对于那些你没有听说过谁,或把谁听说过他们,但没有使用过他们,那正是此文章是关于什么的。 具体来说,我们将讨论名称空间和自动加载,然后在下一个教程中,我们将了解它们如何组合在一起。

也就是说,到目前为止,我们将完成我们对插件所做的工作,然后对其进行更新,以使其使用名称空间和自动加载。 这将使您对概念有实际的了解,并为您在下一个项目中工作时添加到开发清单中的一些新工具提供了帮助。

什么是命名空间?

与大多数教程一样,我喜欢给出正式的定义,然后将其分解为更多的对话术语。 PHP手册定义命名空间像这样

在最广泛的定义中,名称空间是一种封装项目的方式。

那不一定对我们有很大帮助,对吗? 有人可能会说,类在做相同的事情时允许属性和功能都可以归纳为项目。 但是手册继续:

PHP命名空间提供了一种对相关类,接口,函数和常量进行分组的方法。

有点清楚了吧? 这意味着,当我们有一组相关的类时,我们可能会将它们分组到文件系统上相同的目录或相似的目录中,但是无法通过查看代码来了解这一点。

命名空间使我们能够做到这一点。

这样考虑:假设您具有一组与CSV相关的功能。

  • 也许您有一个负责读取CSV文件,解析内容并将内容读入数组的类。
  • 然后,您将拥有一个类,负责根据该数组包含的内容来获取该数组并将数据写入数据库。
  • 此后,只要有第三方对象或代码中的其他区域需要读取在项目执行之前读取,解析和保存的数据,就有一个类负责读取这些选项。

所有这些功能应该跨越几个类。 根据您的解决方案的面向对象代码的方式,您可能还会有一组由类实现的接口。 此外,这些类可以组织在/csv目录中,但可以进一步细分为它们自己的子目录。

  • /read
  • /write

也许您会选择稍微不同的组织结构,但是为了使讨论尽可能简单,我认为这很有意义。 因此,也许类接口将位于/csv目录的根目录中,阅读器将位于/read目录中,负责将数据写入数据库的类将位于/write目录中。

就我们如何组织文件而言,到目前为止,我还没有说过什么与众不同。 但这就是名称空间起作用的地方。

具体来说,如果我们能够组织我们的类,以便它们也映射到文件系统中的物理位置,该怎么办?

可以这样考虑:假设您的插件名为Acme CSV,上面的类都组织在其目录和子目录中,依此类推。 这些类的命名空间可能是什么样的,它们如何在项目中声明?

看一下我们称之为Parser类的内容。 此类位于/csv/read

<?php

namespace Acme_CSV\CSV\Read;

class Parser {
    // Class Implementation
}

然后假设我们有一个将数据写入数据库的类:

<?php

namespace Acme_CSV\CSV\Write;

class Serializer {
    // Class Implementation
}

最后,让我们看看从数据库读取数据的类的命名空间是什么样的:

<?php

namespace Acme_CSV\CSV\Read;

class Reader {
    // Class Implementation
}

没什么复杂的,对吧? 虽然上面的标准是不是你整理文件,我想试试我的类映射到它们在磁盘上的位置。 这使得在以后的工作中更容易引用它们。

至此,除了在文件的顶部声明类的组织类型之外,实际上没有什么可看的了。 但是,当您开始合并自动加载功能时,情况就会改变。

关于包装和子包装的话

不过,在讨论自动加载之前,我想对@package@subpackage标记进行简短介绍,以便我们经常在文件注释中使用它们。

例如,您可能在上面的代码中看到过类似的内容:

<?php

/**
 * This is the file comment for the Serializer class.
 * 
 * @package    Acme_CSV
 * @subpackage Write
 */

但是,当您参考phpDocumentor文档时,您将看到有关@subpackage的以下内容:

该标签被认为已弃用,可以在以后的phpDocumentor版本中删除。 建议使用@package标签的功能来提供多个级别。

因此@subpackage已被弃用,这意味着我们可能不再需要使用它。 @package标签呢?

@package标记用于将结构元素分类为逻辑细分。

现在,多层嵌套支持仅位于该标记中。 很高兴知道,对吧? 这意味着我们上面看到的代码可以这样写:

<?php

/**
 * This is the file comment for the Serializer class.
 * 
 * @package    Acme_CSV\Write
 */

当然,这是一个简单的示例,但它说明了问题。 我之所以@subpackage是因为@subpackage是我们在基于WordPress的PHP中经常看到的另一个标签,如果我们要开始采用较新的标准,就需要避免使用它。

什么是自动加载?

话虽如此,让我们回到手头的主要主题。 由于我们已经介绍了名称空间,因此让我们看一下自动加载。 根据PHP手册:

许多编写面向对象应用程序的开发人员为每个类定义创建一个PHP源文件。 最大的麻烦之一是必须在每个脚本的开头编写一长串所需的清单(每个类一个)。

这再好不过了吗? 尽管如此,它并没有真正解释什么是自动加载。 它只是说明了它可以解决的问题。

在PHP 5中,这不再是必需的…[它支持加载]当前未定义的类和接口会自动加载。

听起来很棒,对吗? 但是有一个警告,我们将在下一个教程中对其进行详细探讨。 但是直到那时,这里是:要获得此功能,我们必须实现一个功能,该功能知道在哪里查找要加载的文件以及如何解析这些文件的目录结构。

这听起来有些乏味,在某些情况下可能是这样,但是如果您采用一致的方式来组织工作,那么自动加载代码可以移植。 也就是说,您可以使用编写的函数,将其放入任何基于PHP的项目中,并准备进行所有操作。

但是,此特定教程与编写代码无关。 这是关于涵盖将在下一个教程中实现的代码概念背后的想法。

为什么有这个意义呢?

根据您询问的人,您可能将名称空间和自动加载视为PHP的新功能。 对于某些人来说,这是真的。 对于其他人,他们已经使用这两个概念已有一段时间了。

WordPress可以阻止其采用PHP的较新功能的一件事是其对向后兼容性的承诺。 这不一定是好事或坏事,它是应用程序的一个属性。

但是由于WordPress具有运行它的最低版本的PHP,因此并不总是采用较新的语言功能。 而当采用的是最低版本,它采用WordPress的专用开发了一小会儿,开始在他们的代码中使用这些功能。

那不是一件坏事。 简而言之,开发人员正在以其成熟的速度与应用程序保持同步。

但是随着WordPress的不断发展或您对项目运行环境的控制,您可能有兴趣采用某些以前不知道或不知道可用的语言功能。

命名空间和自动加载是该语言的两个强大功能,它们在使代码更具可读性,更有条理甚至可维护性方面大有帮助。 因此,如果您尚未在WordPress的任何工作中使用它们,特别是如果您正在使用WordPress插件,那么我敦促您考虑这样做。

结论

命名空间使我们能够以使相关类的逻辑分组更加容易的方式来组织代码。 此外,自动加载通过减少我们需要使用的includeinclude_oncerequirerequire_once语句的数量,使我们的代码更具可读性。

这使我们正在编写的源代码更加清晰,因为它仅关注于它所负责的逻辑,而无需执行诸如导入文件,处理各种目录结构之类的事情,并且无需了解应有的更多信息(更不用说开发人员必须不断重新输入所有内容,以便他们可以访问文件)。

对于那些想要确保其代码结构遵循磁盘上文件和目录的组织结构的人们,它使我们能够完全按照这种方式组织我们的项目。

即使说了这么多,这也只是名称空间和自动加载的一种方法和一些优点。 PHP手册和其他开放源代码项目中涵盖了更高级的主题,如果您有时间,我建议您复习一下。

在下一个教程中,我们将通过应用本教程中学到的知识来总结本系列,因为我们将名称空间引入并自动加载到WordPress插件中。 在此之前,如果您正在寻找其他与WordPress相关的材料,则可以在个人资料页面上找到我以前的所有教程,也可以在我的博客Twitter 关注我。

请不要在下面的表单中留下任何有关名称空间,自动加载或WordPress的未解决的问题。

翻译自: https://code.tutsplus.com/tutorials/using-namespaces-and-autoloading-in-wordpress-plugins-3--cms-27332

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值