base-reality/php-to-javascript

此包已被废弃且不再维护。未建议替代包。

一个PHP到JavaScript的转换器,可自动将PHP源代码(包括类)转换为JavaScript。

安装: 970

依赖项: 0

建议者: 0

安全性: 0

星级: 102

关注者: 12

分支: 31

开放性问题: 22

语言:JavaScript

0.2.2 2013-10-01 15:51 UTC

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没有本地方式来捕获不同的异常类型,并对其进行不同的处理。虽然已经提出了不同的实现方法,但这尚未实现,并且需要命名空间(目前尚未实现)才能工作。

拉取请求

由于各种原因,本项目不接受拉取请求。如果您发现了一个错误,请直接打开一个问题。如果您希望看到增强功能,请首先打开一个问题来讨论。