PHP开发者的 PHP源代码 --之一 结构

PHP 开发者的 PHP 源代码—结构

作为一名PHP开发人员,我发现自己在日常工作中越来越多地引用PHP的源代码。从理解幕后发生的事情,到找出很奇怪的案例,再看看为什么有些代码应该是正确的,但是实际上代码却是有问题的,这些都需要研究PHP源代码。在文档丢失、不完整或错误的情况下,研究它也非常有用。因此,我决定在一系列文章中分享我学到的知识,这些文章旨在让PHP开发人员有足够的知识来真正阅读PHP背后的C源代码。我们不需要事先知道C语言(我们将介绍一些基础知识),但知道C知识将会有所帮助。

这是本系列的第一篇文章。在本文中,我们将介绍PHP应用程序的基本知识:在哪里找到它,代码库的一般结构以及一些关于C语言的基本概念。需要明确的是,这个系列的目标是阅读理解一些源代码。这就意味着,在这个系列的某些知识点上,一些简化的知识将会被用于概念,从而在不过度复杂化的情况下达到目的。它不会对阅读产生重大影响,但如果你工作于PHP核心,那就需要更多的东西。当我做写作时,我会试着指出这些概念。

另外,本系列文章将基于5.4代码库。从版本到版本,这些概念应该是一样的,但是我们限定此PHP 版本,
让我们开始吧。


在哪里找到PHP 源代码

下载源代码的最简单方法是来自PHP的SVN存储库。出于我们的目的,我们将检查5.4分支。如果您想要研究最新的PHP的架构,或者想要实际地为它开发(修复bug,实现特性等等),这是非常棒的。值得注意的是,PHP社区目前(在撰写本文时)正在向GIT存储库迁移。一旦完成,我将修改PHP的引用。

实际情况是,下载源代码对我们的目的并不是很有用。我们不想编辑它,我们只想使用它,并追踪调用的方式。我们可以下载它,然后把它加载到一个好的IDE中,这样我们就可以点击函数定义之类的东西了,但是我发现实现这一点比较难。必须有一个更好的解决方案。

事实证明,PHP社区为我们的目的维护了一个非常好的工具。众所周知是lxr.php.net。这基本上是一个自动生成的源代码的可搜索列表,这也是语法高亮显示和链接到源代码的工具。这是我几乎完全用来浏览C源代码的东西,它很好(即使我在做补丁,我仍然引用lxr,而不是我前面说的下载代码库)。我们还不会讲到如何有效地使用搜索,但我们会在后面的帖子中讲到PHP核心函数时说说搜索。

从这里开始,我们将讨论PHP 5.4版本。出于这些目的,我们将使用lxr链接作为文章其余部分的基础。任何时候我引用“5.4的根”,也就是这一页。
现在我们可以看到源代码树了,让我们开始讨论那里有什么。

PHP 的 结构

因此,当您查看在5.4根目录下的文件和目录清单时,会有很多事情发生。除了两个目录之外ext和Zend,我希望您忽略所有其他内容。其余的文件和目录对于PHP的执行和开发很重要,但是为了我们的目的,我们可以完全忽略它们。那么为什么这两个目录如此重要呢?

好吧,PHP应用程序被分为两部分。第一部分是Zend Engine,它为我们的PHP代码运行的运行时环境提供了强大的功能。它处理PHP提供的所有“语言级别”特性,包括:变量、语句、语法解析、代码执行和错误处理。没有引擎,就不会有PHP。引擎的源代码位于Zend目录中。

PHP核心的第二部分是PHP中包含的扩展。这些扩展包括我们可以从PHP调用的每一个核心函数(如strpos、substr、arraydiff、mysqlconnect等)。它们还包括核心类(MySQLi、SplFixedArray、PDO等等)。

确定您想要查看的功能的一个简单的方法是,查看PHP的主要文档。它也分为两个主要部分语言引用和函数引用。如果您想要的是在语言引用中定义的,那么它很可能在Zend文件夹中找到。如果它在函数引用中,它很可能在ext文件夹中找到。

C 的 一些基本概念

这部分不是让你成为C的精通者,这是一个“用户手册”,一些基本知识。
变量
在C语言中,变量是静态和严格类型的。这意味着在使用变量之前,必须首先使用类型定义变量。一旦它被定义,你就不能改变它的类型(你可以稍后再转换它,但是你必须使用一个不同的变量来改变它)。原因在于,在C语言中,变量并不存在。它们只是为了方便而使用的内存地址的标签。正因为如此,C没有像PHP那样的引用。相反,它的指针。就我们的目的而言,把指针看作是指向另一个变量的变量。可以把它想象成PHP中的变量变量。

那么,我们来讨论一下变量语法。C不会对变量加任何前缀。所以一种区分不同变量的方法是看这个定义。如果您在函数的顶部(或函数的签名)中看到一行,首先是变量类型后面跟着一个空格,接下来的是一个变量。不过,还有一个关键点是变量名前面可以在它前面有一个或多个符号。星号(*)符号表示该变量是指向该类型的指针(引用)。两个星号表示该变量是引用的引用。三个表示变量是引用引用的引用。

这个方向性说明很重要,因为PHP内部大量使用了双级指针。这是因为引擎需要能够通过的数据块(PHP变量),并处理各种各样好玩的东西像PHP引用,即写即拷,和对象引用等。所以就意识到**ptr只是意味着我们使用两个级别的引用(没有引用值,但引用一个特定的引用)。这可能会有点让人迷惑,但是如果引用对您来说是全新的,我建议您阅读一下这个主题,这对我们有帮助。

现在,关于指针的另一件重要的事情是,它们如何应用于C中的数组(不是PHP数组,而是C变量中的数组)。由于指针是一个内存地址,我们可以通过分配一个内存块来声明一个数组,并通过递增指针来遍历它。简单地说,我们可以使用C数据类型char,它代表单个字符(8位)来存储字符串的单个字符。但是我们也可以像数组一样使用它来访问字符串中随后的字节。因此,我们不需要将整个字符串存储在一个变量中,我们可以将一个指针存储到第一个字节。然后,我们可以增加指针(增加它的内存地址)来遍历字符串。

char *foo = "test";
// foo is now a pointer to "t" in a memory segment that stores "test"
// To access "e", we could do any of the following:
char e = foo[1];
char e = *(foo + 1);
char e = *(++foo);

如果想了解更多的关于 变量和指针的C 知识,请查询此免费书

预处理指南

C在编译之前使用了一个称为预处理的步骤。这可以帮助性能优化,动态编写代码,这取决于你传递给编译器的参数选择。我们将讨论两个主要的预处理指令:条件语句和宏。

条件语句允许将代码包含在已编译的输出中,或者不基于定义。这些看起来像下面的例子。这允许为不同的操作系统编写不同的代码(这样一个函数就可以在Windows和Linux上高效地工作,即使它们有不同的api)。此外,它还可以根据配置指令允许包含或不包含代码段。实际上,这是编译PHP的配置步骤的内部机制。

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif

另一个预处理指令我将称之为宏。这些基本上都是迷你函数来帮助简化程序。它们实际上并不是函数,预处理程序只是简单的文本替换,这在编译之前就已经完成了。由于这个原因,宏不需要实际执行任何函数调用。您可以为函数定义编写一个宏(PHP实际上是这样做的,但我们将在后面的文章中讨论它)。宏的要点是,宏允许在程序编译之前程序已经解析了这些简单的代码。

#define FOO(a) ((a) + 1)
int b = FOO(1); // Converted to int b = 1 + 1

C源文件

这是本章节的最后一部分,我们应该讨论的是C源代码使用的不同类型的文件。有两个主要的文件:.c和.h。 .c文件包含构建的源代码。一般来说,.c文件包含没有跨文件共享的函数。 .h(或头文件)文件定义被其他.C 文件所引用的函数,这与任何预处理宏是一样的。头文件确定公共API的方式是通过重新声明没有主体的函数签名(类似于PHP处理接口和抽象方法的方式)。这允许通过头文件将源代码链接在一起。

在接下来的部分

在本系列的下一部分中,我们将讨论PHP内部函数是如何在C中定义的,因此您将能够查询任何内部函数(例如strlen)并查找它的定义并查看它在做什么。请继续关注!

有问题吗?有说明评论?你可以自由地发表评论,或者使用你最喜欢的交流方式来留下你的观点。

本文翻译自 Anthony Ferrara 文章, https://blog.ircmaxell.com/2012/03/phps-source-code-for-php-developers.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值