将Ruby / Rails应用程序移植到PHP 5

时间:2009-01-23 06:07:34

标签: php ruby

我有一个非常大的Ruby on Rails应用程序,我想移植到PHP 5.2或者PHP 5.3(如果5.3已经发布)。

我一直在寻找一种自动转换简单类和ERB模板之类的简单方法。我希望在语言太不相似的情况下,我必须自己做更复杂的事情。

有人可以提出这样做​​的方法吗?还是一个可以自动化其中一些的脚本?

修改

这样做有一个商业案例。这是否是一个合理的商业案例是另一个我不想在这里讨论的问题。我们有一个类似于Rails的框架 - 真正的问题是从Ruby转换到PHP而不是Rails转换为PHP。我并不是真的在寻找能够神奇地完成所有工作的东西,只是一些简单的东西会给你带来惊天动地。即使它所做的一切都改变了:

def somemethod somearg
  some.ruby.code
end

为:

public function somemethod($somearg) {
  // some.ruby.code
}

并在内容中留下内容作为红宝石在php评论中仍然可以让工作变得更轻松。

理想情况下,会有一些东西可以做到这一点或类似的东西。否则我可能会自己使用写工具。

5 个答案:

答案 0 :(得分:6)

在任何两种语言之间移植应用程序是一项非常重要的工作。在这种情况下,由于php和ruby之间的差异,情况更糟。你不能希望得到任何类型的自动化过程。

如果你需要这样做(而为什么本身就是一个不同的故事),你可以尝试使用一个设计最接近rails的php框架。最佳候选人可能是SymfonyMaintainable PHP Framework

我不知道 - 这项工作的理由是什么?

编辑:

在php中,许多符号一旦定义就是全局的和不可变的。例如,无法重新定义类和函数,也没有名称空间支持。在ruby中,可以 - 并且非常常用 - 在运行时操作类。这是不可能自动转换的,并且在许多情况下只是不可能做到。即使您使用phps魔术方法(__get / __set / __call)攻击它,性能损失也会非常严重,以至于它会使您的应用程序无法使用。唯一的方法是手工完成。

您也许可以使用rumld之类的工具为您提供一个起点。另请参阅this,了解更多ruby-to-uml工具。

答案 1 :(得分:3)

让我告诉你一个关于自动程序转换的故事......

几年前,我在一所教育机构工作。这个教育机构运行了一个基于ENTERPRISE_DB_VENDOR的ERP系统,并且已经这样做了大约20年。原始系统是用COBOL& amp;一些$ ENTERPRISE_DB_VENDOR报告工具/语言。多年来,报告工具已弃用(并添加了C)。在某些时候,$ ENTERPRISE_DB_VENDOR杀死了该工具。不幸的是,仍然有一些重要的组成部分。

“最简单”的解决方案是为$ ERP_VENDOR的一些出色的开发人员编写一个将报表工具翻译成C的转换工具。几乎难以理解,显然是由计算机生成但仍然完美的功能C.根据我的理解,计划是的,这将成为让产品现在正常工作的权宜之计,但是,这些东西将会很快被手动重写。

向前迈进10年......我的第一个任务之一就是在网上发布一些报告 - 这份报告最初是用旧的报告语言编写的。然后它被转换为C.它从未被重写过 - 人们只是简单地添加小功能或修复错误。是。他们进入并对计算机生成的C进行了更改。

在考虑尝试编写自动转换工具之前,请考虑一下。

答案 2 :(得分:1)

我完全赞同troelskn,这是一项艰巨的任务,我认为您很难找到任何形式的移植应用程序的自动化流程。

您最好的选择是找到一个在设计上非常相似的框架,并逐个移植所有类。

这里最繁琐的事情将是涉及数据库的地方。据我所知,仍然没有针对PHP的ORM解决方案,甚至接近Rails的ActiveRecord。你必须自己编写很多数据库代码粘合代码,并自己编写所有的模型查找器等。自从我上次检查以来,这方面可能有一些改进,但PHP本质上与ActiveRecord设计模式有一些问题。

同样,我必须回应一下我确信很多人都在想的...为什么在地球上你想要将应用程序从RoR移植到PHP。这听起来像是一件昂贵的事情,无论是时间还是金钱,都没有明显的优势 - 除非当然你已经碰到了Ruby,它根本无法做到PHP可以做的事情。而且我觉得这很难相信。

答案 3 :(得分:1)

只是随机的脑波可能有帮助

使用JRuby获取JVM中间语言代码,然后从中生成PHP代码。

我会留给你解决细节!

答案 4 :(得分:1)

这个ruby gem声称能够将ruby转换为php。没有测试过,但值得一试。 https://rubygems.org/gems/php http://php.rubyforge.org/