1997 年,以色列程序员 Zeev Suraski 及 Andi Gutmans 加入了 Zend 公司 的 PHP 语言开发,发布了 PHP 3, PHP 4, PHP 5,注意没有 PHP 6,再到现在的 PHP 7。 1975 年出生的 Zeev Suraski 在 Zend 工作了 20 年。也许是在语言、架构和库的工作上找不到发展方向了。

题记

PHP 语言的创始人 Rasmus Lerdorf 生于 1968 年,今年已 51 岁,他在 1995 年以 Personal Home Page Tools 为名发布了 PHP 1.0。他的辉煌随着雅虎在搜索领域的颓败而黯淡。

1997 年,以色列程序员 Zeev Suraski 及 Andi Gutmans 加入了 Zend 公司 的 PHP 语言开发,发布了 PHP 3, PHP 4, PHP 5,注意没有 PHP 6,再到现在的 PHP 7。 1975 年出生的 Zeev Suraski 在 Zend 工作了 20 年。也许是在语言、架构和库的工作上找不到发展方向了。

前几天 Zeev Suraski 宣布从 Zend 离职,业界比较惊讶,PHP 7 优化的开发者鸟哥说是这是早已预定好的事。原来 Zeev Suraski 辞职,他想做 P++,那 P++ 是啥?他通过《P++ idea: FAQ》进行了回答,笔者作了全文翻译。

关于 PHP 语言动态静态的看法

笔者自 PHP 4.0 时开始使用,觉得 PHP 语言的动态性与 Web 应用细节经常发生变化的需求是绝配。在 PHP 最初的时代,语言哲学就是——不需要框架,因为 PHP 说——我就是框架。

因此,某种程度上,我不太理解那些在 Web 应用开上把 PHP 和 Python 写成 Java 风味的程序员,数不清的类和依赖,冗长的命名空间、包名,类的深层次调用随处可见,各种不必要的自定义异常,繁重的框架。

看着这样的代码,你会有一种想用水果刀把代码赘肉割掉的冲动,这样代码可以减少一半,运行速度和消耗也可大幅降低,可维护性提高。

PHP 也让我想到 Python 最早的一批 Web 框架 Quixote,用中文形容就是“佛性 ” ,发布过三个版本,现在还用 1.x 的大有人在,因为在那个年代 Web 应用的痛点已经被框架妥善地解决,这点上,PHP 本身就完成的很好。Quixote 并不优雅,但能用。

PHP 在新时代,受到 Go 和 Rust 的冲击,也借鉴了同类语言语法,加入了丰富的语言特性,逐步进化为一门花招较多、看起来更完善的动态语言。不可否认,它确实是在不断进化,于是也产生了 Laravel 这样搞定一切的框架,却不一定比 Django、Flask、ROR、Node.js 的方案更容易获得市场认可,因为 PHP 的动态性是优势,如果要静态类型检查,你 Rust 啊。

在国内软件工程现状上,看似优雅的设计最后会成为绊脚石,优雅的框架只适合观赏,或给能理解优雅的程序员使用,而这类人在企业中往往凤毛麟角。

静态检查的剖析

Talk is cheap,show me your code. 以下即为 PHP 7 中开启静态检查的方式,P++ 的提案,就是可以全局开启,并在更大范围内开启:

<?php declare(strict_types=1);

function sum(float $a, float $b) {
    return $a + $b;
}
echo sum(1, 1);
echo sum(1, '1');

以上代码,如果第一行 strict_types=0 时,可以正常输出 22,而上述代码的执行会报错:

2
( ! ) Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type float, string given, called in
test_strict_type.php on line 7 and defined in
test_strict_type.php on line 3
( ! ) TypeError: Argument 2 passed to sum() must be of the type float, string given, called in test_strict_type.php on line 7 in test_strict_type.php on line 3
Call Stack
#   Time    Memory  Function        Location
1   0.0005  409184  {main}( )       ...\test_strict_type.php:0
2   0.0006  409184  sum( )  ...\test_strict_type.php:7

结论还是,语言特性对于了解语言特性的人有用。

实践上,笔者对 P++ 提案持不完全支持态度,以有限的社区专注动态特性,可以做的还有更多。

感谢阅读。