PHP代码重构工具


74

是否有任何工具支持重构PHP代码(重命名变量,提取方法,查找方法引用等)?谢谢。


3
我想使用动态语言进行可靠的重构确实很困难……
AndreiRînea2010年

2
是的,是的,但是我怀疑这里的真正问题是没有使用好的基础架构(解析,静态分析,转换)来构建工具。在基础牢固之前,尝试建造房屋几乎没有任何意义。
伊拉·巴克斯特

基础越来越强大。参见stackoverflow.com/a/21400723/120163
Ira Baxter

1
2017年后期,我怔怔的工作AST重构工具校长:github.com/RectorPHP
托马什Votruba

Answers:


14

Scisr是一个简单,独立的PHP重构工具。

我知道这是一个老问题,但是由于它是PHP重构工具最好的缺点之一,所以我想将新项目添加到列表中。

我的许多设计目标都是出于此处提到的其他项目的不足而产生的-它们与某些IDE绑定在一起,或者试图指示您的测试实践,或者需要大量死于繁琐的体力劳动。我希望在Scisr中创造一个更好的整体体验。安装和运行很简单。它试图变得聪明,但又不是聪明。它完成了我发现最适合自动化的任务。请享用!


我刚刚阅读了您的项目主页。我完全同意该项目背后的方法,并希望它能做得很好。(我在PC上进行开发,因此不幸的是,我必须等到移至Ubuntu后才能使用它)
JW。

很高兴你喜欢!如果您想做一点黑客操作,那么在Windows环境中运行它应该不会太难。我的猜测是,文件路径将是唯一真正的麻烦,而很多问题是由我从CodeSniffer抄录的代码处理的,我相信它支持Windows。
伊恩·格林利夫·杨

链接已断开-似乎是这样:github.com/iangreenleaf/Scisr
Walter Mundt

@ Walter-Mundt-谢谢。我不久前更改了我的github用户名,并将其破解。立即修复。
Ian Greenleaf Young

12

rephactor是一种自动重构工具。它仍然有些不完整,但是有一些基本的重构。

否则,一个好的测试套件确实是重构的最佳工具。


15
这使用正则表达式来查找代码。这根本不安全。
Ira Baxter

5
自动重构从未如此。您应该在前后进行测试以验证操作。Rephactor实际上集成了之前/之后的测试流程。
troelskn

7
@troelskn:从来没有?为什么要以破坏程序的方式实施重构工具?那只是意味着您拥有一个真正糟糕的重构工具。正确地执行大多数重构在技术上很简单。这是很多工程上的工作,而且大多数人都不想为此付出代价,这解释了为什么那里的东西通常非常糟糕。但是,这并不意味着重构工具必须被打破。
艾拉·巴克斯特

对代码库的任何更改都存在引入错误的风险。
troelskn 2010年

6
@troelskn:不太普遍。对于动态语言,是的,因为名称实现绑定是在运行时完成的,而静态语言(例如Haskell或C ++)则在编译前/代码运行之前完成名称实现绑定,因此可以保证重构成功。这就是动态语言通常很烂的原因。
杰西

8

Jetbrains的PHPStorm支持重构, http://www.jetbrains.com/phpstorm/index.html

重命名重构适用于文件,函数,常量,类,属性,方法,参数以及局部和全局变量。还提供以下重构:

  • 介绍变量
  • 介绍常数
  • 介绍领域
  • 内联变量

他们还提供一些免费的开源项目许可证!


2
实际上,此IDE确实支持重构。不幸的是,它存在一些可用性问题。我希望他们尽快解决。例如,当您在选择中进行查找/替换时,编辑器窗口将全部跳到“全部替换”上。总的来说,我喜欢并使用它,尽管如果它支持重命名,我会在心跳中选择Aptana。
argyle,

里面很棒,但是与eclipse / netbeans相比,可用性确实很糟糕。例如,搜索/替换和团队工具等BASIC功能。
gaRex

6

NetBeans IDE具有一些重构功能,但它似乎并不总是有效。但是,我将6.1与早期的PHP访问结合使用。我希望6.5在PHP中具有更好的重构功能。


我使用的是Netbeans 6.5,您可以执行重命名方法之类的操作,但是它不能修复其他文件中的引用,即使是同一项目中的文件也是如此,这使得它几乎无用。
cletus

我正在使用Netbeans 6.7,这有点用...
罗纳德·康科

我使用的是6.9.1,我认为在PHP的情况下,重构功能仍然仅限于字符串查找/替换。对于动态语言,重构能力将始终受到限制。您仍然无法执行诸如在所有上下文中右键单击类名称并将其重命名为其他名称的操作。
rjha94

在大多数情况下,使用Netbeans 7.2(/ 3)重构就像一种魅力。在不同的上下文中重命名类/方法/变量。
juwens 2013年

5

https://github.com/QafooLabs/php-refactoring-browser

PHP重构浏览器是该好书中描述的重构浏览器的最新版本。它可以使用一些帮助(请提供帮助),但是它支持几种常见的重构。

在撰写本文时,浏览器支持:

  • 提取方法
  • 重命名局部变量
  • 将本地转换为实例变量
  • 重命名类和命名空间
  • 优化使用语句(特定于PHP)

有一个SublimeText插件可以正常工作。在查看新代码时,我将应用一些简单的重构来帮助我掌握代码库。


3

我最喜欢的重构工具还是EditPlus结合Total Commander的超快速文件搜索功能。(提示:Alt + F7)我完全同意马克·比耶克的回答,您希望完全控制何时何地更换什么。

每当我必须进行一些重构时,我都会在总指挥官中创建要更改的文件的列表,方法是使用内置函数搜索或仅通过选择它们,然后将它们全部拖至EditPlus

Editplus可以使用常规文本匹配,正则表达式匹配或多行匹配来搜索和替换当前文件,选区或所有打开的文件。它确实可以让您完全控制:)

此外,用于代码重构的方便工具是EditPlus的Macro Recorder(Ctrl + Q键开始记录宏1-9,Alt + 1-9开始回放宏)。

掌握了要点之后,您便知道可以通过代码搜索变量ctrl + shift +(home || end ||箭头键),删除,复制/粘贴并使用键盘向导喜欢的所有方法,例如,在30秒内将CSV文件转换为一堆SQL查询。


12
这不是重构。它只是编辑。
Ira Baxter

2
重构只是自动编辑。
quodlibetor 2010年

7
@quotlibetor:编写贝多芬第五作品只是按照您的定义进行编辑。重构之间的区别(以语义上合法的方式移动定义良好的代码块)与移动具有未知含义的任意文本块在质量上有很大不同,以致于无法消除这两个术语之间的区别。
艾拉·巴克斯特

3

我个人更喜欢PHPEclipse IDE作为我的主要开发工具。但是我真的很想念在那里重构的基本“替换项目中的所有地方”。

但是非常简单的find / sed命令可以轻松解决它:

find . -type f -name "*Controller.php" -print0 \
         | xargs -0 sed -i 's/string1/string2/g'

因此,您可以明智地使用它来查找引用,重命名,删除和使用源代码进行各种操作。

顺便说一句:您甚至都不记得所有这些参数和属性-只需键入一次,然后通过reverse-i-search进行调用。

希望这可以帮助。


2
请注意sed命令:重构变量名称时,您通常希望在特定比赛(例如特定功能)中限制引用。您可以在一个类中多次使用$ data变量,但是您可能只想在函数_dataRead()中更改其名称。这样做的功能设置了简单的sed命令和IDE插件之间的区别。
Emilio AL


2

也许仅仅是因为我对重构的概念仍然感到满意,但是我不喜欢拥有工具来帮助我。

我仍然更喜欢手动执行大多数重构,因为这会迫使我放慢速度,并真正考虑我要移动的内容以及原因。


3
重构不应让您放慢脚步。重构应该是发展中的快速而自信的一步。如果感觉重构需要您特别注意,则在大多数情况下都将跳过它,只是为了舒适。
viam0Zah 2010年

我同意马克的看法。除此之外-我没有得到重构的主要卖点:“这使代码成为一种格式,可以被全球任何地方的程序员接受和理解。” 但是我们都不同。对我来说,对别人来说容易的事情可能很难,而如果您将代码重构给其他人,对我来说可能很难。那有什么意义呢?
斯坦

我不同意重构的意思是“将代码带到任何程序员都可以接受和理解的格式”。最简单的示例是重命名方法,如果方法名称不正确,您可以轻松地对其进行改进,并确信您所做的更改不会影响其他任何人。显然,如果要提供一个供其他使用的jar,则不会重命名公共方法,而是创建一个新的方法并弃用旧的方法。但是在那种情况下,您仍然可以重构,以便内部代码调用更好命名的函数。
Juan Mendes

确实重构应该是有信心的,因为您要更改结构而不是功能,但是手动重构肯定会拖慢您的速度,因为您要确保自己没有遗漏任何东西。就像您将论文从芝加哥转换为牛津风格一样(总是一个好主意)。您没有在更改文本的语义,而是在更改语法,并且在梳理过程中,您可能会发现(a)不需要重构,或者(b)需要清理的其他内容。我认为这是一个很好的练习。
Paul d'Aoust


2

从IntelliJ尝试Web IDE。现在它处于EAP阶段(alpha / beta),但是我将它用作唯一的IDE已有几个月了,因此它非常稳定而且非常好。


我也使用PHPStorm,它具有非常基本的重构支持:重命名/移动,引入变量,引入常量,引入常量,内联,安全删除。
Juan Mendes


1

Netbeans 6.5中没有对PHP的重构支持,尽管它在将来的版本中提供。

PDT eclipse插件也不支持重构。

Aptana也不支持重构。我也无法使用goto定义。

我最终使用搜索并当前替换。我也至少希望重命名功能支持。


1

据我所知,唯一对PHP进行任何重要重构的IDE都是来自PHP和Eclipse PHP插件制造商的Zend Studio。虽然功能非常基本。据我所知,没有任何东西具有Resharper for C#等产品的功能。


0

PDT for Eclipse支持一些基本的重构(我知道)。您可以重命名类,并在引用它们时自动重命名它们,我想您甚至可以移动文件并更改其包含/需要引用。


在撰写本文时,我相信PDT确实如此。
布莱恩·沃肖

不,目前不是。这是主弱PDT的:(但是在某些在下一个版本的会的。
gaRex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.