您知道哪些特定于 PHP 的反模式? [关闭]

Posted

技术标签:

【中文标题】您知道哪些特定于 PHP 的反模式? [关闭]【英文标题】:What are the PHP-specific antipatterns that you know of? [closed] 【发布时间】:2010-10-22 01:14:30 【问题描述】:

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 - 使用网络框架。

以下是一些我认为是特定于 PHP 的示例:

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

那么,你最喜欢的 PHP 注意事项是什么?你如何正确地做到这一点?

【问题讨论】:

作为社区 wiki 会不会更好? 【参考方案1】:

我不同意这个:

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

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

【讨论】:

+1 我同意。如果一个页面非常复杂,你应该使用 mvc,但是对于页面的设计来说,mvc 足够简单,特别是如果你正在使用你的自定义框架(下一个将处理你的代码的人可能会诅咒你:D) 我喜欢 CodeIgniter 的做法——但在框架中它本质上变成了视图。那么,如果您的新市场需要具有不同字体、布局和营销内容的国际化页面版本,而您没有可互换的视图,您会怎么做? 你不喜欢用 PHP 实现的大量模板语言吗? 同理,如果 PHP 是一种“模板语言”,那么我应该嘲笑你用它来编写业务逻辑。使用模板可以让您 a) 以更少的冗长表达更具表现力,并且 b) 为不受信任的用户提供一种安全的方式来创建内容。当然,普通的 PHP 通常可以直接用作模板层(通常是最好的选择),但这并不能完全满足。 PHP 是一种模板语言!【参考方案2】:

在 php 文件的末尾添加关闭“?>”标签可能会导致意外地将空格推送到输出缓冲区。 PHP 解释器会自动为文件添加结束标签,而手动添加在某种程度上是一种反模式。

【讨论】:

来自 PHP 文档:“如果文件是纯 PHP 代码,最好在文件末尾省略 PHP 结束标记。”见php.net/manual/en/language.basic-syntax.phptags.php【参考方案3】:
    永远不要在没有检查和清理的情况下使用 $_GET$_POST。 了解如何设置php.ini 权限。 切勿将变量放入原始 SQL。 如果您使用框架,请使用依赖项较少的框架。 停止过度概括。 在 php 文件中分发您的代码。在大多数情况下,没有必要将所有内容都放在一个 index.php 中。 在编写代码之前降低复杂性。 尊重它是一个 Web 应用程序这一事实。 (尝试成为RESTful。)它不是桌面应用程序。所以不要把所有东西都放到$_SESSION。 每 10 行代码至少有一个注释行。一年后你会读到的。我保证! 代码like a girl - 让阅读更愉快。

【讨论】:

不能同意 9。当然你会在一年后阅读它,但代码应该足够自我注释才能理解它。评论变老的速度比代码快得多。维护代码命名约定比牢记始终更新 cmets 更容易。【参考方案4】:

我目前最讨厌的是查询函数的返回类型不一致。这是当你调用一个函数来执行一个查询,它会返回

    未找到匹配项时为 NULL 或 FALSE 或类似内容 找到单个匹配项时的匹配对象/值 找到多个匹配项时的匹配对象/值数组

这迫使您检查返回类型并具体处理每种情况。最好总是简单地返回一个包含 0、1 或 n 个元素的数组。

【讨论】:

【参考方案5】:

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

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

还有比这更可怕的吗?

【讨论】:

可以,$_REQUEST['username']... $query='SELECT * FROM users WHERE username=\''.$_COOKIE['username'].'\' AND password=\''.$_COOKIE['password'].' \'';同样的错误,但没有人怀疑 $_COOKIE 有什么问题。 @roe,$_REQUEST 更可怕!我打算直接在查询中使用超级全局变量而不是专门使用 $_POST 的想法,应该清楚地说明这一点。【参考方案6】:

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

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

许多 PHP 开发人员一直停留在结构化时代。 PHP 很久以前就支持类和对象,我只是不明白为什么人们一直将 PHP 硬编码为 html,没有模板或什么都没有。

我相信,如果有这么多开发人员继续这样编程,来自其他语言(如 .NET 或 Java)的开发人员已经获得了批评该语言的权利。 PHP 是一门非常棒的语言,非常灵活,虽然还有些初级但正在成长,但很多人就是不明白,他们只想通过复制和粘贴旧的经典来解决。

【讨论】:

【参考方案7】: 使用 SPL 使用 PDO 而不是使用 mysql_query 或 pg_query 或其他 始终在用户输入中使用过滤器扩展

【讨论】:

以上是关于您知道哪些特定于 PHP 的反模式? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

页面顶部的空白(特定于 Firefox)[关闭]

在 PHP 项目中,存在哪些存储、访问和组织辅助对象的模式? [关闭]

您可以在 PhoneGap 中添加特定于平台的代码吗?

更新特定于电子邮件提交按钮上的此代码

如何使用特定于州的代理?

PHP 根据特定于时区的日期更改CSS