一个文件包含多少行 PHP 代码才算太多?

10

我正在创建一个PHP文件,其中包含2个mysql数据库调用,其余的脚本都是if语句,用于判断像file_exists等简单变量。到目前为止,这个文件已经有大约2000行代码。

如果语句为true,将代码包含在一个单独的文件中,是否是更好的做法?还是直接将代码键入if语句本身更好?

在PHP中,单个文件的最大代码行数应该遵循多少?

8个回答

13

我认为,与PHP文件中的行数有关的任何性能问题都不应该存在,可以尽可能地增加文件大小。

至于模式和最佳实践,我认为你必须自己做出判断。我见过很多组织良好、有几千行代码的文件,也见过很多实际上很小且难以阅读的文件。

我的建议是:

  • 评估源代码的可读性,始终保持良好的组织。
  • 在一定程度上进行逻辑分离很重要。如果你的文件涉及到:大量数据库访问、写入、修改、HTML渲染、AJAX等功能,你可能需要分离这些功能或使用面向对象的方法。
  • 始终寻找逻辑分离和代码之间的平衡。它既不应该杂乱无章,也不应该过于整洁而有大量只有10行的文件。

4
PHP文件作为一个整体进行处理。即使包含未被调用的代码,大文件也会对性能产生显著影响。然而,2000行并不是与“大型”同一数量级的问题。 - 3Dave
1
一个像APC这样的操作码缓存可以处理那个问题。 - Sasha Chedygov

3

从计算机的角度来看,一个单文件中有2000行代码并不算糟糕,但在大多数情况下是可以避免的。您可以了解一下MVC设计模式,它可以帮助您更好地组织代码。

此外,请记住,包含(大量)文件会减慢代码的执行速度。


1
一个字节码缓存,比如APC,可以解决最后的问题。 - Sasha Chedygov

3

您可能想阅读像《代码整洁之道》这样的书。以下是该书中的一些要点:

  • 一个类应该只有一个职责
  • 一个函数应该只做一件事,并且做得很好

使用PHP时,如果您不使用类方法,将会遇到重复问题。请自己花点时间研究这个主题,这将在扩展和维护方面节省更多时间。


2
行数并不是性能的好指标。确保你的代码组织得高效,分成逻辑类或块,并且不要将无关代码合并到单个模块中。
像PHP这样的语言存在一个问题,除非进行一些创造性的缓存,否则每个包含文件的每行都必须被标记化、通过解析树压缩并转换为有意义的指令,每次请求托管页面时都要执行此操作。编译平台如.NET和Java不会受到这种性能杀手的影响。
此外,由于其他帖子中提到MVC作为保持文件短小的一种方式:良好的代码组织是经验和常识的结果,并不与任何特定的模式或架构相关。MVC很有趣,但不是解决此问题的方法。

一个像APC一样的操作码缓存 - 没有必要特别创意 - 将会解决编译问题。 - ceejayoz
真的,但据我所知,APC仍然不能执行本地编译器能够执行的许多优化步骤。并不完全相同。 - 3Dave
此外,.NET与PHP(带或不带APC)的基准测试:http://www.brandonsavage.net/of-lies-damned-lies-and-benchmarks-redux/ - 3Dave
当然它不会像编译语言那样快,但像你所说的,比较是不合适的,毫无意义。 - Sasha Chedygov

1

你需要关注代码行数吗?不一定。只要确保你的代码有组织、高效,并且不冗长即可。


0

其实并不重要,只要你已经适当地记录了代码,尽可能地模块化,并检查了任何低效的部分。你可能会有一个10,000行的文件。虽然我通常会将应用程序的每个部分拆分为大约500-1000行。


0

2k行对我来说太多了...虽然这取决于你遵循的代码风格,例如许多换行符、许多小函数或良好的API合同注释可以增加大小,但它们是良好的实践。此外,良好的代码格式化可以增加行数。

关于PHP,需要知道的是:它是只有一个类的2k行,还是只有一个大的包含非面向对象PHP代码的文件?它是否与模板语句和程序逻辑混合(就像我经常在PHP代码中发现的那样)?

通常情况下,当要拆分时,我不会计算这些行。它们只是习惯性的。如果代码变得混乱,我会进行反应和重构。尽管最近我们团队编写的一些代码中看到了一些模式:

  • 如果大小超过20LOC(不包括注释)并且使用if/else子句,则提取函数/方法
  • 如果大小>200-300LOC,则提取到另一个类中
  • 如果工件>10,则提取到另一个包/文件夹中

这还要看我的代码类型。例如,如果涉及大量逻辑(if/else/switch/for),每个函数的代码行数会减少。如果几乎没有涉及任何逻辑(简单愚蠢的单路径代码语句),则限制会增加。最重要的规则是:人类是否能够理解代码。他们是否能够很好地阅读它。


0

我不知道任何有用的方法来分割如此简单的代码,特别是如果它们在语义上都属于一起。

也许更有趣的是思考是否可以通过重构来消除一些代码。例如,如果您经常使用具有略微不同变量的特定组合检查,将检查组合外包到函数中并在适当的位置调用可能会有所帮助。
我记得曾经看过一个项目,大部分写得很好,但存在这样的问题。例如,解析其配置文件的代码被重复编写了:

if (file_exists("configfile")) {
  /* tons of code here */
} else if (file_exists("/etc/configfile")) {
  /* almost the same code again */
}

这只是一个极端例子,但你明白了吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接