代码之家  ›  专栏  ›  技术社区  ›  Christian

将PHP转换为JS的PHP代码[closed]

  •  2
  • Christian  · 技术社区  · 14 年前

    • 功能性-我使用的是来自 php.js
    • 语法-???

    • “::”应该是“.”(类运算符-实际上不是必需的)

    请注意,生成的代码基本上独立于PHP环境,因此没有“如果它使用PHP类呢?”。

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

    编辑: 看看别人。我知道不使用AJAX听上去很可笑,但是这个世界并没有在宣传和良好的设计条件下工作(=AJAX)。我不能让每一个用户每秒轮询我的服务器5到10次,只让我的服务器返回“是”或“否”的答案。请记住,切换是异步的,我不能缓冲AJAX调用。

    编辑2: 我确信我所做的是我目前处境下最好的方法。没有“可能更好”的方法,所以不要发表非建设性的评论。我已经说不出更多的细节了。从PHP代码到JS的转换仅仅是缩短用户输入的问题;我们只需要一个表达式,然后将其转换为所需的任何语言(在本例中,从PHP到JS)。如何工作的条件将 不改变 不管我如何描述这个系统直到API规范,用无用的(对你来说)原型文档淹没这个主题都不会有任何帮助。

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

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

    • 5=="test" -- 5==“测试”
    • '$'.(func(12)*10) -- '$'+(func(12)*10)
    • Fields::count()==5 Fields.count()==5
    • $this->id==5 -- this.id==5

    关于最后一个例子,不要担心上下文/范围,它是正确的。还要注意,这些表达可能看起来很奇怪;这是因为他们 表达;必须返回一个值的一行代码,用于解释没有EOL(;)以及返回布尔值的多次使用(像backtick操作符执行、PHP标记、echo、die、list等异国情调的东西。。故意遗漏)

    5 回复  |  直到 14 年前
        1
  •  7
  •   Charles    14 年前

    好吧,我来试试这个。。。

    token_get_all() . 它将PHP源代码解析为字符串并返回 the very same tokens that PHP itself uses (包括敬爱的T\u PAAMAYIM\u 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代码而不是编写特定的Javascript?你只是在操纵页面内容一点,为什么你需要PHP代码来做这个决定?
        2
  •  3
  •   el.pescado - нет войне    14 年前

    你试过了吗 Harmony Framework ?

        3
  •  2
  •   Christian    14 年前

    下面是我想出的快速而肮脏的解决方案,写在不到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));
    

    编辑: 真不敢相信这个问题所引起的大惊小怪与所花的时间相比。

    随便批评吧。我个人并不太喜欢。

        4
  •  0
  •   danda    9 年前

    我写了一个叫做 php2js

    也许你会发现它很有用。

        5
  •  -1
  •   Tito100    8 年前

    PHP-to-JavaScript

    • 名称空间,使用
    • 类、抽象类和接口
    • 常量和定义
    • 神奇的方法\uuu获取\uuu设置\uuu调用
    • 还有更多