您知道哪些特定于 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 的反模式? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章