PHP 和 JavaScript,越看越像的两门语言
截至 2026 年 8 月,PHP 的最新稳定版是 8.5.x(来源:PHP 官网发布公告),JavaScript 这边最新定稿的标准是 ES2026,也就是 ECMAScript 第 17 版(来源:ECMA 官网规范文档)。放在十多年前,一个在服务器上拼页面,一个在浏览器里折腾交互,谁也不觉得对方跟自己有多像。这些年两边迭代下来,新版 PHP 和新版 JS 在语法、类型、标准库上确实越走越近,相似点多到可以逐类去比。下面按几个最能说明问题的方向挨个说。一、空值处理,都在帮程序员少写几行
这是近几年最直观的趋同。PHP 8.0 加的可选链 ?-> 和 ES2020 里 JS 的 ?. 是一回事:链式调用中间任何一环是空,整条表达式直接返回空,不用再堆一层层的 isset 或者判空判断。空值合并运算符也撞脸了,PHP 7.0 的 ?? 和 ES2020 的 ??,都是只在左侧是空值时才取右侧的默认值,绕开了 || 和 ?: 把 0、空字符串误判成"没值"的老毛病。三元运算符两边都有,PHP 还多一个省略中间值的 ?: 简写,JS 想省字的话用 || 或 ?? 也能凑合。二、函数,写法基本同款
箭头函数是最典型的一处。PHP 7.4 的 fn($x) => $x * 2 和 JS 的 (x) => x * 2 设计一致:单表达式自动返回、自动捕获外层变量,PHP 这边连 use 声明都省了。... 语法两边通用,既能收集剩余参数(function fn(...$args) 和 function fn(...args)),也能展开数组或参数列表、合并数组。函数都是一等公民,能当参数传给数组处理函数,回调那套玩法两边一个样。命名参数方面,PHP 8.0 原生支持 func(paramName: $value),JS 没有原生的,但传对象参数再解构(func({ paramName: value }))能达到差不多的效果,至少不用再死记参数顺序。三、类型系统,都往"可选强类型"上靠
两个语言都从"动态弱类型随便写"往"想要严谨也行"的方向挪。PHP 7 开始支持标量类型声明和返回值类型,8.0 之后联合类型(int|string)、交叉类型、只读属性、枚举(8.1)陆续补齐;JS 本身保持动态,但 TypeScript 成了事实标准,联合类型、泛型这些概念两边能对上话,区别只是 PHP 在运行时强制检查,TS 在编译期检查。运行时判断的对应关系也很工整:PHP 的 is_int()/is_string()/is_array(),对应 JS 的 typeof、Array.isArray()、instanceof;PHP 8.1 的枚举和 TypeScript 的 enum 是一个路数。四、面向对象,同一副骨架
类定义、单继承(extends)、构造函数、静态成员、类常量,两边都是这套经典模型。可见性上,PHP 的 public/protected/private 和 JS 类字段加#私有字段,管封装的能力差不多。PHP 8.0 的构造参数属性提升能在参数里直接声明类属性,和 JS 类字段声明的思路一样,都是省掉那堆重复的赋值代码。匿名类/类表达式、抽象类、接口,两边也都有。五、数组和字符串,连方法名都对上了
解构赋值:PHP 7.1 的 [$a, $b] = $arr 和 ['key' => $a] = $arr,对应 JS 的数组解构和对象解构,语法和功能都对齐。高阶数组方法:PHP 的 array_map/array_filter/array_reduce 对应 JS 的 map/filter/reduce,函数式处理集合数据是同一套逻辑。字符串方法最有意思,PHP 8.0 才补上的 str_contains/str_starts_with/str_ends_with,对应 JS 老早就有的 includes/startsWith/endsWith,功能完全对齐,PHP 这边总算告别了"用 strpos 判断包含还得写成 !== false"的日子。六、生成器与协程,异步的两种实现
生成器两边都有,yield 的用法一致,都是可中断、可恢复的分段执行,处理大集合时按需取值,省内存。协程这边,PHP 8.1 引入的 Fibers 是在同一个进程里手动挂起、恢复的协程,JS 的 async/await 靠事件循环自动调度,底层机制不一样,但效果一致:都能用同步风格的写法处理非阻塞逻辑,把回调地狱解决了。七、异常处理,结构一致
try/catch/finally 两边一模一样。PHP 7 起所有错误和异常都实现 Throwable 接口,JS 的错误类型都挂在 Error 基类下面,都能统一捕获,也都能自定义异常类搭业务错误层级。PHP 8.0 让 throw 可以当表达式用,JS 在箭头函数、三元表达式里直接抛错也很常见,这个小体验也趋同了。八、零零碎碎,也都对上了
字符串插值:PHP 的 "Hello $name" 对应 JS 模板字符串的 `${name}`,多行字符串 PHP 有 heredoc/nowdoc,JS 有反引号。模块化:PHP 的 namespace + use 和 JS 的 import/export 干的是一件事,都是为了组织大型项目、避免命名冲突。内置能力:JSON 编解码(json_encode/json_decode 对 JSON.stringify/parse)、正则、常量定义,都是开箱即用。执行方式:两个语言都从纯解释执行起步,PHP 靠 OPcache 把编译好的字节码缓存起来,JS 引擎靠 JIT 即时编译,速度跟早年比都不可同日而语。一句话:PHP 和 JavaScript 起跑点天差地别,但现代版本的写法重合越来越多,从一边跳到另一边,学习曲线比想象中平。[1] PHP 8.5 Release Announcement(PHP 官网):https://www.php.net/releases/8.5/en.php[2] ECMAScript 2026 Language Specification,ECMA-262 第 17 版(ECMA 官网):https://tc39.es/ecma262/2026/[3] PHP 8.0 Release Announcement(PHP 官网):https://www.php.net/releases/8.0/en.php[4] PHP 8.1 Release Announcement(PHP 官网):https://www.php.net/releases/8.1/en.php[5] MDN 可选链与空值合并运算符:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining[6] MDN String.prototype.includes:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/includes