代码审查最主要的方面是确保代码实现了其预定目的。重点关注代码逻辑,从吸收输入到产生输出的实行流程。检讨是否有不合逻辑的步骤、缺点的打算,或者流程可能会意外停滞的地方。
检讨输入:代码是否精确处理了它可能吸收到的所有类型的数据?这包括用户输入、数据库数据或来自外部系统的信息。检讨输出:验证代码产生的结果是否精确,并且格式符合预期。输出数据是否符合哀求?彻底的测试是确保功能的关键。单元测试帮助我们系统地检讨具有不同输入变量的代码的各个组件,确保代码在所有情形下都按预期运行。
在这个步骤中,我创造能够将代码发布到审查运用程序或暂存做事器,并确认我在代码审查中的创造及其实际事情办法是很有帮助的。对付棘手的部分,我也方向于搜索添加的单元测试。如果它们丢失了,请作者添加它们可能是一个好主张。
2. 代码功能:是否按设计事情?
在一个可靠的代码审查的核心,我们须要回答一个基本的问题:这些代码做了它该当做的事情吗?开始直接将代码与项目的需求或规范进行比较。您是否已实现所有必要的功能?是否有禁绝确的行为或短缺任何东西?接下来,仔细地逐步实行代码的逻辑。实行是否遵照从吸收到的输入到终极输出的合理路径?探求任何无意义的分支(比如总是为假的if语句)、无限循环或潜在的崩溃。
检讨代码如何处理所有形式的输入。它是否可以处理不同的用户条款、从数据库中提取的各种数据,或者来自另一个别系的信息?同样主要的是,输出是否精确,格式是否精确,并与运用程序的其他部分预期的内容保持同等?
技能提示:不要只是通过点击运用程序来测试。虽然开拓职员承担编写单元测试的紧张任务,但不要低估在代码审查期间批驳性眼力的代价。
短缺测试:是否存在没有相应单元测试的代码块?边缘用例:测试是否只覆盖预期的场景,还是包括意外的输入和边界条件?测试质量:测试是否写得很好,它们是否清楚地声明了预期的结果?在检讨时,想象一下用户可能故意(或意外)考试测验毁坏代码的办法。你能给它输入奇怪的输入,引起不屈常的事宜序列,或者使它过载吗?弹性代码该当优雅地处理这些场景。闇练利用像Xdebug这样的调试工具。它许可您停息代码实行,逐行单步实行,并在事情发生变革时仔细检讨变量的值。对付前端代码,我喜好考虑可能涌现的不同UI状态。
一些关键的状态包括空状态,加载状态和缺点状态,但主要的是要进一步:
部分加载状态:数据在逐步加载时如何显示?UI的不同部分是否有清晰的加载指示器?输入验证状态:UI如何立即传达表单验证的成功或失落败(例如,内联缺点)?成功状态:在一个动作之后(例如,提交一份表格),成功是如何传达的?交互状态:元素是否供应悬停、聚焦或活动状态的视觉反馈?3. 代码可读性:你能读懂它吗?
可读的代码对付可掩护性和协作是必不可少的。让我们把重点放在使您的代码易于人类和机器解析。从严格遵守PSR-1和PSR-12等编码标准开始。这些标准为PHP代码建立了一种通用措辞,定义了缩进、命名约定、文件组织等规则。
通过遵照标准,您的代码变得可预测和同等,减少了阅读者的认知包袱。PSR等社区标准最大限度地减少了新加入项目的开拓职员的学习曲线,并提高了与不同开拓工具的兼容性。
在代码审查期间,仔细评估变量和函数命名。这些名称是否清楚地表达了它们的目的,避免了单字母变量、不必要的缩写或模糊的术语?命名良好的元素有助于自文档化的代码,最大限度地减少了对阐明性注释的需求。如果有注释,它们是否专注于阐明逻辑或设计选择背后的“为什么”,而不是大略地重复代码的功能?
如果代码觉得很繁芜,建议作者重构。这可能涉及提取方法,利用更具描述性的变量名,或为清晰起见重新布局代码块。强调长期可掩护性的主要性,纵然目前须要一些额外的努力。
利用链接器(如PHPCS)和静态剖析工具(如PHPStan)作为审查过程的一部分。这些工具有助于实行标准,捕捉潜在的问题,并促进同等的可读性。探求代码和已建立的标准之间的不匹配,作为潜在的改进领域。
如果您创造自己在评审过程中很难明得代码流,这就强烈地表明将来的可掩护性将是一个寻衅。不要犹豫,向作者提出这一点-互助谈论每每可以创造更好的办理方案或澄清潜在的逻辑。
除了格式和命名,严格遵守项目或公司特定的编码规则。这些内容涵盖了命名空间、代码组织和架构模式等方面。虽然自动化工具可以捕获许多违规行为,但在审查过程中要保持当心,以创造工具可能遗漏的潜在问题。这确保了全体代码库的同等性。
4. 安全性
Web运用程序是攻击的紧张目标。在PHP天下中,安全的代码审查会特殊关注一些关键领域。
首先,永久不要相信来自外部来源的数据 处理所有用户输入(表单提交、URL参数等)潜在的恶意利用PHP内置的过滤器函数(filter_var,filter_input)去除危险字符(例如,<script>标签以防止XSS)并实行规则以确保输入与您期望的匹配(例如,精确的电子邮件格式或有效的数字范围)。
为了保护您的运用程序免受臭名昭著的SQL注入漏洞的影响,请避免直接将用户输入连接到SQL查询中。相反,依赖于mysqli或PDO准备语句(或者更好,在数据库抽象层[DBAL]或一些好的ORM上)。它们清楚地将SQL构造与用户供应的数据分开,许可数据库安全地处理数据并肃清SQL注入考试测验。删除危险字符(例如,<script> 标签以防止XSS)并逼迫实行规则以确保输入符合你的期望。
末了,小心处理缺点。避免向用户显示原始缺点(数据库缺点、堆栈跟踪),由于它们可能会透露敏感的系统信息。相反,将缺点记录到一个文件中,供开拓职员进行故障打消,确保这些日志本身受到保护,不受未经授权的访问。当涌现缺点时,向用户显示通用的、有帮助的缺点,并记录详细信息以进行内部调试。在我们的例子中,我们紧张利用Monolog并将日志转发到DataDog或NewRelic等工具。我们也总是有一个哨兵实例连接,以网络更多的信息的问题。
虽然当代框架供应了内置的安全功能,但在代码审查期间确保其精确实现至关主要。密切关注这些方面:
输入清理:代码是否仔细地过滤和验证来自用户的任何数据(表单、URL参数等)?探求特定于框架的输入清理函数或方法。预处理语句:数据库查询是否始终利用预处理语句构建?检讨框架方法,这些方法有助于防止SQL注入。缺点处理:代码是否避免向用户暴露原始缺点或堆栈跟踪?是否在内部记录缺点,以便开拓职员进行故障打消?在涌现故障时,是否有用户友好的后备机制?5. PHP性能优化
实行缓慢的代码会让用户感到沮丧,并且可能会耗尽做事器资源。一个全面的代码审查该当始终考虑性能优化,特殊是关注以下方面:
更智能的算法:你构建代码的办法对速率有很大的影响。剖析您的核心算法,并探求利用更有效数据构造的机会(例如,考虑哈希表而不是用于搜索的嵌套循环)。熟习大O表示法有助于理解代码的效率如何随着较大的数据集而扩展。数据库交互:对数据库的每个查询都会增加开销。通过利用缓存技能(Memcached,Redis)将频繁访问的数据存储在内存中,减少不必要的数据库调用。当你确实须要查询时,优化你的SQL:适当地利用索引,避免获取比你须要的更多的数据,并把稳繁芜的连接可能会减慢速率。在开始利用缓存之前,首先关注索引和查询优化。探求瓶颈:不要盲目优化!利用像Blackfire这样的剖析工具来精确丈量你的运用程序在哪里花费了大部分韶光。这将精确定位最须要把稳的函数或数据库查询。Blackfire供应了对实行韶光、函数调用和内存利用的宝贵见地。技能解释过早的优化是一个陷阱:首先关注干净的、功能性的代码。过早地过度优化会使代码更难阅读。缓存有多种形式:根据运用程序的须要,在内存缓存、基于文件的缓存乃至HTTP缓存之间进行选择。数据集越大,算法的影响就越大:对小规模数据运行良好的代码可能会随着输入大小的增加而爬取。
请特殊把稳数据库迁移。密切关注数据库迁移,同时考虑代码性能和迁移过程本身。大型迁移可能须要相称长的韶光(乃至可能须要几分钟),因此提前理解潜在影响至关主要。
代码评审把稳事变虽然彻底的依赖审计超出了范例的代码审查范围,但以下是须要把稳的关键事变:
严重过期的软件包:把稳已安装的软件包与其最新版本之间的任何紧张版本差异。这可能意味着潜在的兼容性问题或安全风险。漏洞警报:如果您利用Snyk或Dependabot等工具,请检讨它们是否标记了项目依赖项中的任何已知漏洞。版本含义:建议软件包更新时,请把稳语义版本掌握(紧张.次要.补丁),由于紧张更新可能会有毁坏性的变动。公司标准:一些组织有关于依赖关系更新的特定政策,审阅者该当熟习这些政策。审查范围:如果韶光许可或者安全性是一个关键问题,利用可验证性检讨工具进行简短的依赖性扫描可能是代码审查的一个有代价的补充。数据库优化和安全始终确保数据库查询同等地利用预处理语句,以减轻SQL注入风险。利用与数据库集成的剖析工具(例如,MySQL的慢速查询日志)或Blackfire/New Relic等扩展来识别最有效的优化。把稳索引-确保频繁查询的列上存在适当的索引,特殊是对付具有多列搜索条件的表。
缺点处理定义创建缺点层次构造的自定义非常类(例如:DatabaseException、ValidationException)。这种方法可以在全体代码库中实现粒度缺点处理。策略性地利用不同的日志级别(调试、信息、警告、缺点)。
适当地配置日志记录工具,以根据严重性进行存储或发出警报。末了,仔细考虑显示给用户的缺点。这些该当清楚地勾引用户找到办理方案,而不会透露敏感的系统细节。
由于信息有限,用户报告的网络安全问题可能很棘手。这便是为什么明确的缺点和详细的日志是必不可少的。它们为您供应了快速查明问题和改进用户体验所需的线索。
将代码评审作为一种习气代码审查不应该被看作是一次性的苦差事,也不应该被看作是大略地创造bug的一种办法。通过将它们作为开拓过程中的常规实践,您将不断提高PHP代码库的质量。每一次评审会议都能构建技能知识并加强团队内部的协作。
代码审查也是在团队中通报知识的好方法。不仅编写任务的开拓职员知道它是如何实现的,而且进行代码审查的人也会对它有很好的理解。在我们的例子中,我们确保添加,删除或变动的每一行都至少由另一个人审查。
请记住,干净、安全和构造良好的代码不仅仅是美学。它节省了调试韶光,降落了漏洞的风险,并许可您的运用程序更优雅地扩展。让代码审查成为你事情流程中不可协商的一部分。随着韶光的推移,这些好处将变得更加繁芜,导致更健壮,更随意马虎掩护和更成功的PHP项目。