【问题标题】:PHP code to convert PHP to JS [closed]将 PHP 转换为 JS 的 PHP 代码 [关闭]
【发布时间】:2011-03-15 05:44:30
【问题描述】:

我需要一些 PHP 代码来将一些 PHP 转换为 JS。

  • 功能 - 我正在使用来自php.js 的常见 PHP 函数
  • 语法 - ???

问题在于转换语法。请注意,我不需要完整的 PHP 语法;不需要支持类定义/声明。以下是需要转换的小清单:

  • “。”应该是“+”(字符串连接)
  • “->”应该是“.” (对象运算符)
  • “::”应该是“.” (类运算符 - 不是必需的)

请注意,生成的代码几乎独立于 PHP 环境,所以没有“如果它使用 PHP 类怎么办?”。

我不是要完整的代码,只是对这种转换的正确方向的提示;我正在考虑使用状态机/引擎。

如果您对我为什么将代码推送到用户端感到好奇:我需要一种动态方式来在特定条件下更改特定元素的可见性。我的计划是这样做,而不必在服务器端执行此代码并进行不必要的 ajax 调用。

编辑:看人。我知道不使用 AJAX 对您来说听起来很可笑,但这个世界并不适合炒作和听起来不错的设计条件 (=ajax)。我根本负担不起每个用户每秒轮询我的服务器 5 到 10 次,只是为了让我的服务器返回“是”或“否”的答案。请记住,切换是异步的,我无法缓冲 AJAX 调用。

编辑 2:我确信我正在做的是在我的情况下最好的方法。没有“可能更好”的方法,所以不要发布非建设性的 cmets。我无法比我已经了解的更详细了。从 PHP 代码到 JS 的转换只是缩短用户输入的问题;我们只需要一个表达式,然后将其转换为所需的任何一种语言(在这种特殊情况下,从 PHP 到 JS)。无论我是否将系统描述为 API 规范,其工作方式的条件不会改变,并且用无用的(对您而言)原型文档淹没该主题根本无济于事。

另外,对于那些认为这个想法是在梦中醒来后产生的;知道这已经在技术开发和 QA 之间进行了审查,所以请不要偏离不存在的设计问题。

编辑 3: 示例(原始 PHP 代码和预期输出):

  • (原始)--(转换)
  • 5=="test" -- 5=="test"
  • '$'.(func(12)*10) -- '$'+(func(12)*10)
  • Fields::count()==5 -- Fields.count()==5
  • $this->id==5 -- this.id==5

关于最后一个例子,不用担心上下文/范围,它是正确的。另请注意,表达式可能看起来很奇怪;这是因为它们都是表达式;必须返回值的单行代码,它解释了 EOL (;) 的缺失以及返回布尔值的多种用途。 (反引号运算符执行、PHP 标记、echo、die、list 等奇异的东西。故意省略)

【问题讨论】:

  • 也许我在这里太保守了,但这听起来像一个想法,它消耗的时间比它节省的时间要多。
  • 也许你应该告诉我们为什么你想做这件令人震惊的疯狂事情。为什么用户每秒会发出 5-10 次请求?您正在构建的应用程序到底是什么?可能还有其他更好的方法来完成这项工作。
  • 我为什么要讲这么多细节?我已经指定了使用条件,并且通过提供更多细节,这些条件不会改变。现在,您介意专注于讨论而不是轻浮的“假设”吗?该决定通过了 3 人的审查(其中 2 人审查了技术方面),所以请停止指责我不知道自己在做什么。我可能不是一个装饰过的 stackoverflow 用户,但这并不意味着我是一个玩 PHP/JS 的新手。
  • @Christian 你能发布一些应该转换的完整示例吗?您是否考虑过构建一种简化的“元”语言来满足您的需求并且可以编译成 JS 和 PHP?这可能比使用正则表达式或其他东西检测各种语言怪癖更容易。
  • 没关系,但你必须了解观众,而不是埋没领导。当然,您不能指望编译器专家 24/7 全天候在线等待您的问题。我确信您不希望有人只给您一些代码,但您首先使用了另外一个措辞:“我需要一些 PHP 代码来将一些 PHP 转换为 JS。”我并不是说这就是你在这个问题上遇到问题的原因。但是,所有相关方之间存在沟通问题。换句话说,您错误地提出了问题。

标签: php javascript parsing syntax


【解决方案1】:

我创建了工具 PHP-to-JavaScript 用于将 PHP 代码转换为 JavaScript。其支持:

  • 命名空间,使用
  • 类、抽象类扩展和接口
  • 常量和定义
  • 异常和捕获
  • 列表()
  • 魔术方法 __get __set 和 __call
  • 还有更多

【讨论】:

  • 不转换。返回错误或根本不转换。甚至是简单的 3 行代码。
  • @Green 我修复了它。这只是托管的问题。看到这个应用程序 mojazuvacka.sk 它都是用这个转换器制作的。如果可行,请修复您的投票:)
【解决方案2】:

我写了一个名为php2js 的工具,它可以自动将PHP 代码转换为javascript。它并不完美,但支持最常见的 PHP 功能,包括类、继承、数组等。它还包含并了解 php.js,因此使用 php 的标准库函数编写的代码可能“正常工作”。

也许你会发现它很有用。

【讨论】:

  • 嗯...传播参考?
【解决方案3】:

好吧,让我来试试这个……

拧正则表达式。我爱他们,但有一个更好的方法,它是内置的。查看token_get_all()。它将 PHP 源代码解析为字符串并返回 the very same tokens that PHP itself uses 列表(包括心爱的 T_PAAMAYIM_NEKUDOTAYIM)。然后,您可以完全重建脚本的源代码,一次一个标记,并将其转换为 Javascript 语法。

[charles@teh ~]$ php --interactive
Interactive shell

php > print_r(token_get_all('<?php class Foo { public function bar() { echo "Yikes!"; } } $f = new Foo();  $f->bar(); ?>'));
Array
(
[0] => Array
    (
        [0] => 368
        [1] => <?php 
        [2] => 1
    )

[1] => Array
    (
        [0] => 353
        [1] => class
        [2] => 1
    )

[2] => Array
    (
        [0] => 371
        [1] =>  
        [2] => 1
    )

[3] => Array
    (
        [0] => 307
        [1] => Foo
        [2] => 1
    )
... 

虽然这可能有点矫枉过正,但它也使用 PHP 使用的相同解析规则,因此应该比正则表达式更容易长期使用。它还使您可以灵活地检测无法翻译的功能(即 php-js 不支持的内容)并拒绝翻译和/或解决问题。


另外,你仍然没有告诉我们你在做什么以及你为什么这样做。可能还有更准确、更有用的答案可用。通过向我们提供更多信息来帮助我们帮助您。

  • 您认为轮询是不现实的,因为预期每秒请求数非常高。你为什么期待这个数字?您的应用程序做了什么会导致这种情况?
  • 为什么要翻译 PHP 代码而不是编写特定的 Javascript?您只是稍微操作了页面内容,为什么需要 PHP 代码来做出决定?
  • 语言翻译可能是最简单解决这个问题的方法,因此是一个非常糟糕的想法。它不可能作为第一选择。您还有哪些其他选择,为什么它们被排除在外?

【讨论】:

  • 嗯,有If you're curious as to why I'm pushing code to the user side: I need a dynamic way to change visibility of certain elements given certain conditions. My plan is to do this without having to execute this code server side and having unnecessary ajax calls. 所以,我假设 JS 会做一些花哨的显示,而无需轮询服务器。不过,这必须是可以预测的。也就是影响显示的条件。
  • 我无法想象用户与页面交互的场景,它需要向服务器发出如此多的请求来更新自己仅基于用户交互 .可能是游戏吧?但如果是这样,是不是已经有代码来处理来自用户的事件?缺乏信息使问题变得混乱。
  • 同意,但最终这不是重点。他并没有让我觉得他是一个需要大量牵手的新手;只是一个不耐烦、自大的年轻人。他迟早会学会的。
  • George Marian,非常有趣 ;) Charles,让我简要描述一下发生了什么;你把它比作游戏是正确的(但它不是一个)。正在批量轮询服务器以了解字段详细信息的更改(由其他用户)。这反过来又会影响字段表达式的条件,因此必须重新评估它,最终根据评估显示/隐藏字段。这个系统是在限制 ajax 请求的数量上拼命努力,这要归功于流行的 jquery 组件,已经足够大了。将其视为一种协作工具。
  • 啊,现在我明白了。您让用户有效地输入要执行的代码这一事实几乎可以解释一切。
【解决方案4】:

你试过Harmony Framework吗?

【讨论】:

  • 不,从未听说过。立即查看。
  • 好的,检查了。然而,它看起来非常有趣,远远超出了我的需求(类和函数支持)。我看到它也使用 php.js。
【解决方案5】:

这是我想出的快速而肮脏的解决方案,不到 20 分钟就写好了(可能有很多错误),但看起来很有效。

function convertPhpToJs($php){
    $php=str_split($php,1); $js='';
    $str='';                                                                                      // state; either empty or a quote character
    $strs=array('\'','`','"');                                                                    // string quotes; single double and backtick
    $nums=array('0','1','2','3','4','5','6','7','8','9');                                         // numerals
    $wsps=array(chr(9),chr(10),chr(13),chr(32));                                                  // remove whitespace from code
    foreach($php as $n=>$c){
        $p=isset($php[$n-1])?$php[$n-1]:'';
        $f=isset($php[$n+1])?$php[$n+1]:'';
        if($str!='' && $str!=$c){ $js.=$c; continue; }                                        // in a string
        if($str=='' && in_array($c,$strs)){ $str=$c; $js.=$c; continue; }                     // starting a string
        if($str!='' && $str==$c){ $str='';  $js.=$c; continue; }                              // ending a string
        // else, it is inside code
        if($c=='$')continue;                                                                  // filter out perl-style variable names
        if($c==':' && $f==':'){ $js.='.'; continue; }                                         // replace 1st of :: to .
        if($p==':' && $c==':')continue;                                                       // filter out 2nd char of ::
        if($c=='-' && $f=='>'){ $js.='.'; continue; }                                         // replace 1st of -> to .
        if($p=='-' && $c=='>')continue;                                                       // filter out 2nd char of ->
        if($c=='.' && (!in_array($p,$nums) || !in_array($f,$nums))){ $js.='+'; continue; }    // replace string concat op . to +
        if(in_array($c,$wsps))continue;                                                       // filter out whitespace
        $js.=$c;
    }
    return $js;
}

以下内容:

$window->alert("$".Math::round(450/10));

转换为:

window.alert("$"+Math.round(450/10));

编辑:与花费的时间相比,无法相信这个问题引起的大惊小怪。

随意批评。其实我个人不是很喜欢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2018-05-06
    • 2014-12-02
    • 2010-10-01
    • 1970-01-01
    • 2022-11-21
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多