快速且简单的PHP到JavaScript转换器。

v0.1.1 2019-05-03 11:52 UTC

This package is auto-updated.

Last update: 2024-09-05 23:10:02 UTC


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();