aftermarketpl / php2js
快速且简单的PHP到JavaScript转换器。
Requires
- php: >=7.1
- nikic/php-parser: >=4.0.0
Requires (Dev)
- nacmartin/phpexecjs: >=2.0.0
- phpunit/phpunit: *
- popphp/pop-dir: >=3.0.0
README
该项目旨在创建一个相当完整的PHP到JavaScript转换器。
其主要目的是辅助AfterMarket.pl的内部开发,但由于它也可能对公众感兴趣,因此它以Apache许可证发布,并作为composer包提供。
项目目标
转换器最重要的设计目标是以下这些
- 它主要用于开发新代码,而不是转换现有代码。它不会神奇地将所有现有的遗留PHP代码转换为JavaScript,因为这需要超出项目范围的巨大努力。但如果你考虑到转换器的限制来编写PHP代码,它应该足够健壮,足以满足你的大多数需求。
- 生成的JavaScript代码旨在在浏览器中运行,而不是在服务器环境中运行。这意味着它不使用任何Node.js模块或功能,这也进一步限制了接受的PHP结构和功能的范围。
- 生成的JavaScript代码应该是可读的,并且容易与输入的PHP代码相对应,这样就可以很容易地由人类进行检查和调试。
限制
由于它不是一个通用转换器,因此转换器接受的代码有一定的限制。如果它遇到它无法正确转换的PHP代码,它通常会抛出异常,尽管在某些边缘情况下,它可以从理论上不支持PHP代码生成JavaScript代码;这种代码不一定能够正常运行。
到目前为止,转换器将转换大多数不包含任何类定义或使用的功能PHP代码。因此,以下示例PHP代码将很好地转换为JavaScript
function myFunc($param) { return $param + 1; } $d = $a ? $b + myFunc($c) : $b ** $c;
生成的JavaScript如下
var b, c, d, a; function myFunc(param) { return param + 1; } d = a ? b + myFunc(c) : Math.pow(b, c);
生成的代码很容易由人类阅读,并且只包含最小开销。
尚未接受的PHP语法
以下PHP结构目前不支持,并且可能永远不支持,尽管如果我们有时间,我们可能会实现其中一些
计算变量和函数名称
实际上,你根本不应该这样做。
$a = $$b; $a = $b(); // May be supported in the future
使用方括号进行字符串索引
这主要源于转换器不知道变量是数组还是字符串。随着PHP 7类型提示的出现,如果可以推断出变量的类型,这在未来可能会得到改善。
$a = "string"; $b = $a[1]; // Use substr() instead
一些数组操作
同样,使用加号操作符时,转换器不知道变量是数字还是数组。PHP 7类型提示可能也会改善这一点。
$array = array(); $a = $array + $array2;
一些二进制和赋值运算符
其中一些运算符可能可以通过丑陋的JavaScript支持,因此情况可能会改善。
$a = $b <=> $c; // May be supported in the future $a = $b xor $c; $a = $b ?: $c; // May be supported in the future $a ??= $b; $a **= $c;
变量引用
它们在JavaScript中通常不能轻易地复制。
$a = &$b; function func(&$a) {}
多层break和continue
它们在JavaScript中通常不能轻易地复制。
continue 2; break $a;
类和异常
目前完全不支持,但我们打算在它们上面工作,因此你可以期待将来有相当广泛的支持。
PHP标准库
PHP不仅仅是一种语言,它还包含了一个非常广泛的库,如substr()
或preg_match()
等标准函数。我们打算实现这些函数的广泛范围,但由于这需要大量工作,因此需要一些时间才能实现。一些函数将不会得到支持,因为它们在浏览器环境中没有意义(例如文件I/O)。一些函数相对于预期的收益需要太多的努力,因此我们可能选择不实现它们(尽管你可以做,我们也乐意合并你的代码!)。总的来说,我们首先关注字符串和数组函数,因为这是我们自己在代码中使用的内容。
作为预告,已经实现了一些字符串函数,因此你可以尝试以下代码
$a = strlen($b); $a = substr($b, $c, 1); $a = strtolower($b);
生成的JavaScript将是
a = (b).length; a = (b).charAt(c); a = (b).toLowerCase();