对于初学者而言,可能很难理解为什么某些做法更安全。

但是,以下一些技巧可能超出了 PHP 的范围。

始终使用大括号

让我们看下面的代码:

if (isset($condition) && true === $condition)
echo 'this is a success';
虽然正确,但是你再看看下面的代码 if (isset($condition) && true === $condition)
foreach (range("A", "Z") as $letter)
echo $letter . PHP_EOL;
echo 'this is a success';

  

依旧正确,但是 this is a success 最终只 echo 了一次,这可能是一个陷阱。

等等,我们在来看看将 $condition = false; 写在判断之前会发生什么

$condition = false;
if (isset($condition) && true === $condition)
foreach (range("A", "Z") as $letter)
echo $letter . PHP_EOL;
echo 'this is a success';

  

该程序依旧成功打印 this is a success。

这显然不是我们想要的结果,你现在知道为什么花括号很重要了吧?

省略括号通常会导致不良的副作用。此外,阅读代码要困难得多。所以应当将其改写成这样

$condition = false;
if (isset($condition) && true === $condition) {
foreach (range("A", "Z") as $letter) {
echo $letter . PHP_EOL;
}
echo 'this is a success';
}

  

跳过 else 部分

在使用任何变量之前,最好对它进行初始化。考虑以下例子:

if (isset($condition) && true === $condition) {
$main = 'chocolate';
} else {
$main = 'vanilla';
}

  

如果你认为上面例子 OK 的话,那么试着添加几个 elseif 条件看看

if ($condition) {
$main = 'chocolate';
$time = 2;
} elseif($otherCondition)) {
$main = 'strawberry';
$time = 3;
} elseif($otherOtherCondition)) {
$main = 'apple';
$time = 1;
} else {
$main = 'vanilla';
$time = 9;
}

  

该代码显得很笨重。当你在 elseif 代码块中添加逻辑时你可能会忘记一些变量。

试着这样做:

$main = 'vanilla';
$time = 9; if ($condition) {
$main = 'chocolate';
$time = 2;
} elseif($otherCondition)) {
$main = 'strawberry';
$time = 3;
} elseif($otherOtherCondition)) {
$main = 'apple';
$time = 1;
}

  

这种方式,每个人都知道 $main 和 $time 变量在接下来的代码中应该被定义,该代码似乎更具可读性。

这种方式,每个人都知道 $main 和 $time 变量在接下来的代码中应该被定义,该代码似乎更具可读性。

不要使用 @运算符

在 PHP 中 @是一个错误控制操作符。它用于隐藏错误,但事实上没人希望如此。

相反,你应当试着捕获这些错误并使用错误日志记录。

@操作符有着极大的缺点,比如将任何调试变为噩梦或使代码运行更慢!

对于代码的每次运行,它都会调用 INI 设置以将 error_reporting 设为 0,并在这之后将其设回原始值。

它是如此耗费资源。我觉得完全不使用它才是更为安全的。

一些关于三元运算符的想法

虽然三元运算符可能很方便,但代码有可能更加难以阅读。

不要过度使用三元运算符

三元运算可用于简化 if-else 部分:

$main = ($condition) ? "chocolate" : "vanilla";

  

含义如下:

if ($condition) {
$main = "chocolate";
} else {
$main = "vanilla";
}

  

上面的例子是 ok 的,但我已经看到过如下的例子:

$output = ($condition) ? ($otherCondition) ? 'ok' : 'ko' : 'unknown';

  

不建议链式或嵌套式地使用三元运算。

谨慎使用『Elvis』运算符

Elvis 运算符是一个特殊的运算符。

$foo = $bar ?: "baz";

以上是指:

$foo = $bar ? $bar : "baz";

  

可以这样写:

if ($bar) {
$foo = $bar;
} else {
$foo = "baz";
}

  

信不信由你,正如维基百科所说:

“Elvis 运算符” 这个名字指的是这样一个事实:当它的符号?: 从侧面看时,就像是 埃尔维斯・普雷斯利 (Elvis Presley) 的一个表情符号和他的卷发。

请小心使用空合并运算符

自从 PHP7 起,null 合并运算符 可以用了:

需要将三元运算符与 isset() 结合使用的常见情况的语法。

因此:

$result = isset($_GET['result']) ? $_GET['result'] : "default";

  

可以这样写:

$result = $_GET['result'] ?? "default";

  

在尝试使用空合并操作符替换 ternaries 和 Elvis 操作符时要格外小心!

空合并运算符从不检查条件是否为真,而是检查您的 var 是否已设置而不为空 ( isset() 的概念)。

综上

我希望你喜欢这些编程技巧。我想说的最后一件事是:请不要为了简洁而牺牲了清晰度。

更多内容请访问

怎么从一名码农成为架构师的必看知识点:目录大全(持续更新)50W年薪挑战!

分享几个 PHP 编码的最佳实践的更多相关文章

  1. ​结合异步模型,再次总结Netty多线程编码最佳实践

    更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:​​结合异步模型,再次总结Netty多线程编码最 ...

  2. Dropbox可伸缩性设计最佳实践分享

    http://www.infoq.com/cn/news/2012/11/dropbox-scale-bestpractice Dropbox的运维工程师Rajiv,跟大家分享了可伸缩性设计的最佳实践 ...

  3. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  4. 10个精妙的Java编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  5. 你知道吗?10个精妙的 Java 编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  6. 腾讯优测优分享 | 探索react native首屏渲染最佳实践

    腾讯优测是专业的移动云测试平台,旗下的优分享不定时提供大量移动研发及测试相关的干货~ 此文主要与以下内容相关,希望对大家有帮助. react native给了我们使用javascript开发原生app ...

  7. Windows Azure 安全最佳实践 - 第 7 部分:提示、工具和编码最佳实践

    在撰写这一系列文章的过程中,我总结出了很多最佳实践.在这篇文章中,我介绍了在保护您的WindowsAzure应用程序时需要考虑的更多事项. 下面是一些工具和编码提示与最佳实践: · 在操作系统上运行 ...

  8. 智能合约最佳实践 之 Solidity 编码规范

    每一门语言都有其相应的编码规范, Solidity 也一样, 下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约. 命名规范 避免使用 小写的l,大写的I,大写的O 应该 ...

  9. 亿级SQL Server运维的最佳实践PPT分享

    这次分享是我在微软的一次分享,关于SQL Server运维最佳实践的部分,由于受众来自不同背景,因此我让分享在一个更加抽象的角度进行,PPT分享如下: 点击这里进行下载

随机推荐

  1. win10安装revit失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装revit失败或提示已安装,也有时候想重新安装revit的时候会出现本电脑windows系统已安装revit,你要是不留意直接安装revit,只会安装revit的 ...

  2. win10安装3DSMAX失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装3DSMAX失败或提示已安装,也有时候想重新安装3DSMAX的时候会出现本电脑windows系统已安装3DSMAX,你要是不留意直接安装3DSMAX,只会安装3D ...

  3. Docker的自动构建镜像

    Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...

  4. webdriver访问各个浏览器驱动下载及安装

    这里首先需要查看一下自己安装的selenium版本 查看步骤: windows系统打开cmd命令行输入:pip show selenium查看结果如下: 进入到selenium官网查看版本信息 sel ...

  5. phaser2->3:来个打地鼠试水

    本文中phaser具体版本 phaser2:2.8.1 phaser3:3.17.0 一.实现效果二.实现细节三.项目总结四.参考文档 一.实现效果 源码地址(phaser2&phaser3) ...

  6. 寄生or独立 中国代工厂的悲惨抉择

    2015年苹果.三星.国产手机依旧外表光鲜,最起码,从出货量上看,他们的日子过得还不错,年终奖应该是能发得出来,但这些光鲜的品牌商背后,是一个个悲惨的代工厂,以及一个又一个"一将功成万骨枯& ...

  7. 常用阻塞队列 BlockingQueue 有哪些?

    为什么要使用阻塞队列 之前,介绍了一下 ThreadPoolExecutor 的各参数的含义(并发编程之线程池ThreadPoolExecutor),其中有一个 BlockingQueue,它是一个阻 ...

  8. Windows激活服务器搭建

    1.下载服务端的安装包,下载地址: https://github.com/Wind4/vlmcsd/releases 注意,下载编译好的包省时间,名称为:binaries.tar.gz 或者直接下载我 ...

  9. C# 关于位运算的学习笔记

    一.理解什么是位运算 程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),简单来说位运算就是直接对在内存中的二进制数的每位进行运算操作. 二.学习前先了解一下有哪些运算,运算符都怎么 ...

  10. Eureka 注册中心看这一篇就够了

    服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串.路由信息等.服务注册中心是微服务架构中最基础的设施之一. 在微服务架构流行之前,注册中心 ...