您知道什么是PHP特定的反模式?

时间:2009-04-27 12:26:56

标签: php anti-patterns

PHP作为钝器

我听说PHP最近遭受了很多打击。在很多项目中,我已经看到了疯狂的PHP代码库 - 你真的很想知道这个人在编写代码时是否使用致幻药物。有时,我想知道如果初始开发人员对要做什么有更多的指导,代码会是什么样的。

但是,我也看到一些非常有条理的PHP项目,这些项目是用100%OOP完成的,并且很乐意维护,但它们不是由“php程序员”编写的。

我向所有初级开发者提供Java Anti-Patterns的链接。该页面的一个好处是特定于Java的示例,因为Java的许多功能都适用于常见错误。我希望找到类似的PHP列表,但谷歌搜索没有透露任何有意义的内容。

what a developer should know when programming PHP已经有一些问题,但我想关注的是负面问题。

您在PHP中看到的常见问题应该避免哪些常见问题以及以更好的方式执行相同操作的常见解决方案是什么?

我认为会提到一些明显的例子,但不是特定于PHP的:

  • 不要连接SQL。使用准备陈述或正确的转义。
  • 不要盲目地将PHP嵌入到HTML中 - 使用模板/ MVC。
  • 不要盲目发布未经过滤的原始用户输入 - 将其擦除以进行XSS攻击。
  • 不要手动尝试解析所有的POST和GET - 使用Web框架。

以下是我将考虑PHP特定的一些示例:

  • 不要有太多的文件包含/要求链接层,并尽量避免条件链接。相反,要有一个合理的命名约定并与您的组织保持一致。
  • 请不要使用PHP原始数据库API,除非您可以帮助它,而是使用像ADODB这样的数据库框架。
  • 不要过度使用PHP的动态类型,方法是将变量设置为一个地方的字符串,将布尔值设置在其他地方,然后期望布尔测试有意义。

那么,你最喜欢的PHP 不应该,你是如何做到的?

7 个答案:

答案 0 :(得分:16)

我不同意这个:

  • 不要盲目地将PHP嵌入到HTML中 - 使用模板/ MVC。

PHP是一种模板语言。虽然我同意实现MVC的概念,但我不明白为什么需要在生成Web输出时实现另一个DSL。

答案 1 :(得分:8)

添加结束“?>”标记到php文件的末尾可能导致意外地将白色空格推送到输出缓冲区。 PHP解释器会自动为文件添加结束标记,手动执行它有点反模式。

答案 2 :(得分:5)

  1. 永远不要使用$_GET$_POST而不检查并清理它。
  2. 了解如何设置php.ini权利。
  3. 永远不要将变量放入原始SQL。
  4. 如果使用框架,请使用依赖性较小的框架。
  5. 停止过度概括。
  6. 在php文件上分发您的代码。在大多数情况下,没有必要将所有内容都放在一个index.php
  7. 在编写代码之前降低复杂性。
  8. 尊重它是一个Web应用程序的事实。 (尝试成为RESTful。)这不是桌面应用程序。因此,请停止将所有内容放入$_SESSION
  9. 每10行代码至少有一条注释行。一年后你会读到这个。我保证!
  10. 代码like a girl - 请好好阅读。

答案 3 :(得分:4)

我当前的烦恼是查询函数的不一致 - 返回类型。这是当您调用函数执行查询时,它返回

  1. NULL或FALSE或未找到匹配时的类似内容
  2. 找到单个匹配项时的匹配对象/值
  3. 找到多个匹配项时匹配的对象/值的数组
  4. 强制您检查返回类型并专门处理每个案例。简单地总是返回一个包含0,1或n个元素的数组会更好。

答案 4 :(得分:2)

我最喜欢的一个不应该是:

$query = 'select * from users where username = ' . $_POST['username'];

它会比那更可怕吗?

答案 5 :(得分:0)

如果我必须包括一个喜欢的,那么它必须是karim79发布的那个:

$query = 'select * from users where username = ' . $_POST['username'];

PHP中的许多开发人员都陷入了结构化时代。 PHP支持类和对象,因为不久之前,我只是不明白为什么人们将PHP硬编码为html,没有模板或根本没有。

我相信,如果有这么多开发人员继续这样的编程,其他语言的开发人员,如.NET或Java,都有权批评该语言。 PHP是一种非常优秀的语言,非常灵活,仍然有点小,但正在增长,但许多人只是没有得到它,他们想要的只是通过制作旧的经典副本和解决方案来解决。糊。

答案 6 :(得分:0)

  • 使用SPL
  • 使用PDO而不是使用mysql_query或pg_query或其他
  • 始终在用户输入
  • 上使用过滤器扩展名