Nikita Popov 曾是 PHP 社区中备受尊敬的核心开发者之一。几年间,他深度参与了性能优化工作,一边不断实现新功能,一边修复历史遗留的大量错误,是把 PHP 从“老旧脚本语言”推动为“现代编程语言”的关键人物之一。

Nikita 可谓年轻有为,据说还在高中时期就开始参与 PHP 开发,首次贡献是在 PHP 5.5 版本中。

我们不禁好奇,这位才华横溢的开发者第一次会向 PHP 代码库提交哪些内容?​下面,我们就来看看 Nikita 的首秀吧,了解他是如何开启这段非凡的开源旅程的。

以邮箱为关键词在提交日志中进行搜索,可以发现他首次提交的时间是 2012 年 5 月 20 日。不知道当时高中毕没毕业。

这次提交主要新增了 2 个文件 zend_generators.czend_generators.h,并对 Makefileconfigure 等构建脚本文件做了相应的修改。从注释来看,Nikita 的首次提交只是添加了没有任何功能的、一个名为 Generator 的内置类。文件 zend_generators.c 中的代码也验证了这一点。

#include "zend.h"
#include "zend_API.h"
#include "zend_generators.h"

ZEND_API zend_class_entry *zend_ce_generator;

static const zend_function_entry generator_functions[] = {
       ZEND_FE_END
};

void zend_register_generator_ce(TSRMLS_D) /* {{{ */
{
       zend_class_entry ce;

       INIT_CLASS_ENTRY(ce, "Generator", generator_functions);
       zend_ce_generator = zend_register_internal_class(&ce TSRMLS_CC);
       zend_ce_generator->ce_flags |= ZEND_ACC_FINAL_CLASS;
}
/* }}} */

换句话说,Nikita 的首次提交,只是让我们可以在代码中写出 <?php new Generator(); —— 仅此而已,new 出来的对象没有任何作用。

如果你对 PHP 扩展开发稍有了解,会发现这几行代码是模板化的“公文格式”:定义一个类、注册类名、绑定方法,这套流程任谁来写都是这样。真正透露出一点“作者痕迹”的,只有两个地方:一个是类名 "Generator",另一个是 zend_ce_generator->ce_flags |= ZEND_ACC_FINAL_CLASS;,表明 Generator 这个类无法被继承。

尽管这次提交看起来非常朴素,甚至可以说简陋,却悄然拉开了一个重要特性的序幕——生成器(generators)。这项特性随着 yield 关键字在 PHP 5.5 中正式落地,大大丰富了语言的表达力。

正如所有伟大的旅程都始于第一步,Nikita 的这次“空提交”似乎也预示着他在 PHP 语言演进中的关键角色。

Nikita Popov 目前是 Red Hat 的高级软件工程师,主要从事 LLVM、Clang 和 Rust 编译器的开发工作。



da_miao_zi
1 声望0 粉丝

软件工程师、技术图书译者。译有《图解云计算架构》《图解量子计算机》《计算机是怎样跑起来的》《自制搜索引擎》等。