base-reality / php-to-javascript
一个PHP到JavaScript的转换器,可自动将PHP源代码(包括类)转换为JavaScript。
README
这是一个走得太远的玩笑项目。我将其存档……但将其保留在网上作为一件艺术品。
PHP-to-Javascript
一个将简单的PHP对象转换为JavaScript代码的工具,以便代码可以在服务器端和客户端使用。
有一个页面包含一组示例代码,可以在此[在线转换](http://www.basereality.com/PHPToJavascript/)“PHP到JavaScript转换”。
这并不打算用来转换任意的PHP代码到JavaScript,因为由于两种语言之间的差异,这是不可能的。它的目的是用来编写显式简单的PHP代码,这些代码也可以编译成JavaScript,而不是将大量的PHP代码转换为JavaScript。
如何使用
示例
cd tests
php examples.php
这将转换tests目录中的PHP文件,并为每个文件写入一个等效的JavaScript文件。
程序化
-
从 https://getcomposer.org.cn/ 安装Composer
-
将 "base-reality/php-to-javascript": ">=0.0.3" 添加到您的项目composer.json文件中
"require":{ "base-reality/php-to-javascript": "0.1.16" }
或最新标记的版本。dev master仅应用于开发,而不是生产。
-
将Composer SPL自动加载文件包含到您的项目中
require_once('../vendor/autoload.php');
-
调用转换器
$phpToJavascript = new PHPToJavascript\PHPToJavascript(); $phpToJavascript->addFromFile($inputFilename); $jsOutput = $phpToJavascript->toJavascript();
$jsOutput现在将包含自动生成的PHP源文件的JavaScript版本。
待办事项
-
设置一些自动测试。
-
为foreach循环添加hasOwnProperty检查。
-
支持const与public static相同。
-
找出关于JavaScript保留关键字的处理方法。可能需要检测它们,并在检测到时发出警告或错误。testObject.delete();
-
支持类声明中的变量数组。
-
将PHP数组push转换为JavaScript数组push PHP => $withoutTags[] = false; JS => withoutTags.push(false);
-
支持单元素数组false; PHP => $withoutTags = array(false); JS => var withoutTags = {false};
-
静态类变量应位于类作用域中,而不是全局作用域中。SM PHPToJavascript\CodeConverterState_TSTRING token [T_STRING] => [ClassExample] SM PHPToJavascript\CodeConverterState_Default token [T_DOUBLE_COLON] => [::] SM PHPToJavascript\CodeConverterState_Default token [T_VARIABLE] => [$testStatic] SM PHPToJavascript\CodeConverterState_TVARIABLE token [T_VARIABLE] => [$testStatic] SM PHPToJavascript\CodeConverterState_TVARIABLEGLOBAL token [T_VARIABLE] => [$testStatic] 将变量testStatic添加到PHPToJavascript\GlobalScope作用域
限制
PHP语言有几个特性要么很难映射到JavaScript,要么在JavaScript中根本不可能实现。这些特性几乎肯定永远不会被实现(至少不是我),所以如果你在等待这些功能完成,早点放弃吧。
通过引用传递标量
PHP允许您将标量值通过引用传递到函数中。这个特性在JavaScript中不存在,因此没有大量的工作是无法支持的。
PHP中通过复制传递数组,JavaScript中通过引用传递
在PHP中,数组是通过将数组复制到函数中传递的。在转换后的JavaScript中,数组被转换为对象,对象是通过引用传递的,因此对参数的任何修改也会修改原始作用域中的变量 - 查看。
静态类变量始终是公开的
由于JavaScript中对象的实现方式,静态类变量将始终具有公开的作用域。
定义被转换为值,但在JavaScript中未定义。
代码
define('DATABASE_TYPE', 'MySQL');
echo "Database type is ".DATABASE_TYPE;
被转换为
// define('DATABASE_TYPE', 'MySQL');
document.write( "Database type is " + 'MySQL');
如果这对您来说是个问题 - 当前的解决方案是不使用定义。相反,使用类来定义您的const变量。对于JavaScript来说,将定义作为变量添加到全局作用域是可能的。但那会很糟糕。
关联数组在JavaScript中无序
在PHP中,数组将保持其声明的顺序,例如。
$testArray = array(
'salutation' => 'Hello',
' ',
'people' => 'world'
);
foreach($testArray as $string){
echo $string;
}
将输出 "Hello world"。在JavaScript中的等效输出为 " Helloworld",因为索引没有保持顺序。
如果您需要数组保持顺序,应仅使用整数键。
unset是脆弱的
PHP中的unset
命令适用于任何变量。PHP-To-Javascript将其转换为JavaScript函数delete,该函数仅适用于对象。目前这没问题,因为所有数组都当前作为对象创建,但这是一种非常脆弱的方法。我建议不要使用unset,而是将您想要保留的值复制到一个新的数组中。
列表不受支持
PHP构造list
不受支持。
异常模型不同
JavaScript没有本地方式来捕获不同的异常类型,并对其进行不同的处理。虽然已经提出了不同的实现方法,但这尚未实现,并且需要命名空间(目前尚未实现)才能工作。
拉取请求
由于各种原因,本项目不接受拉取请求。如果您发现了一个错误,请直接打开一个问题。如果您希望看到增强功能,请首先打开一个问题来讨论。