首页 > 编程语言 >php中如何优雅的写复杂if-else

php中如何优雅的写复杂if-else

时间:2022-11-25 15:32:41浏览次数:72  
标签:function return price 优雅 else 支付 php public


提前return

优化逻辑结构,让正常流程走主干,非正常流程提前return,去除不必要的else

优化前


$a = 1;
$b = 2;
$c = 3;

if ($a == 1) {
if ($b == 2) {
if ($c == 3) {
return true;
}
}
}
return false;


优化后


$a = 1;
$b = 2;
$c = 3;

if ($a != 1) {
return false;
}

if ($b != 2) {
return false;
}

if ($c != 3) {
return false;
}
return true;


 

 

使用条件三目运算符

优化前


$a = 1;

if ($a == 1) {
return true;
} else {
return false;
}


优化后

$a = 1;

return $a == 1 ? true : false;


 

使用枚举(表驱动法)

php8新增了match表达式,有兴趣的看鸟哥的介绍:​​https://www.laruence.com/2020/07/13/6033.html​

优化前


$a = 1;

if ($a == 0) {
return '未支付';
} elseif ($a == 1) {
return '已支付';
} else {
return '支付失败';
}


优化后


$a = 1;

$enum = [
0 => '未支付',
1 => '已支付',
2 => '支付失败',
];

return $enum[$a];


如果是调用不同的函数可以考虑call_user_func实现


class Product
{
static function price()
{
echo 1;
}
}

$classname = "Product";
call_user_func(array($classname, 'price'));
call_user_func($classname . '::price'); // As of 5.2.3

$myobject = new Product();

call_user_func(array($myobject, 'price'));


合并条件表达式

优化前

$a = 1;

if ($a == 0) {
return '未支付';
} elseif ($a == 1) {
return '已支付';
} elseif ($a == 2) {
return '已支付';
} else {
return '支付失败';
}


优化后


$a = 1;

if ($a == 0) {
return '未支付';
} elseif (in_array($a, [1, 2])) {
//合并多个表达式
return '已支付';
} else {
return '支付失败';
}


 

策略模式+工厂方法消除if-else


<?php

/**
* 策略模式
* 使用场景
* 假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。
* 例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。
* 场景2:
* 例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告
*/
interface Strategy
{
public function calPrice($price);
}

/**
* 普通会员策略类
*/
class PrimaryStrategy implements Strategy
{
public function calPrice($price)
{
echo "普通会员无折扣";
return $price;
}
}

/**
* 中级会员策略类
*/
class MiddleStrategy implements Strategy
{
public function calPrice($price)
{
echo "中级会员8折优惠";
return $price * 0.8;
}
}

/**
* 高级会员策略类
*/
class HighStrategy implements Strategy
{
public function calPrice($price)
{
echo "高级会员7折优惠";
return $price * 0.7;
}
}

/**
* 价格实现类
*/
class Price
{
/**
* 具体的策略类对象
*/
private $strategyInstance;

/**
* 构造函数,传入一个具体的策略对象
*
* @param object $instance
*/
public function __construct($instance)
{
$this->strategyInstance = $instance;
}

/**
* 计算货品的价格
*
* @param double $price
*/
public function quote($price)
{
return $this->strategyInstance->calPrice($price);
}
}

/**
* 客户端操作
*/
$high = new HighStrategy();
$priceClass = new Price($high);
$price = $priceClass->quote(400);
echo $price;


 

标签:function,return,price,优雅,else,支付,php,public
From: https://blog.51cto.com/u_6353447/5886802

相关文章

  • PHP7带来的重大变革
    PHP7带来的新东西1.类型的声明。可以使用字符串(string),整数(int),浮点数(float),以及布尔值(bool),来声明函数的参数类型与函数返回值。declare(strict_types=1);fun......
  • 前后端分离 Ueditor + PHP 实现阿里云Oss上传
    首先去百度下载UeditorPHP(一般都是UTF-8版本)的当然首先要composer这样滴: "require":{"aliyuncs/oss-sdk-php":"~2.0.0",},解压后结构如下:第一步:创建OssInUe......
  • PHP的生成器yield
    官方解释yieldyield生成器是php5.5之后出现的,官方文档这样解释:yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现Iterator接口的方式,性能开销和复杂性大......
  • PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
    /** *PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作 *     A *    B   C *  D  E F   G......
  • PHP消息队列如何处理订单和配送
    在项目开发者经常会遇到『给用户群发短信』、『订单系统有大量的日志需要记录』或者在秒杀业务的时候服务器无法承受瞬间并发的压力。这种情况下,我们怎么保证系统正常有效的......
  • PHP7实现多进程
    我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEM......
  • PHP7的内核CGI与FastCGI
    CGI:是WebServer与WebApplication之间数据交换的一种协议。FastCGI:同CGI,是一种通信协议,但比CGI在效率上做了一些优化。PHP-CGI:是PHP(WebApplication)对WebSe......
  • PHP判断访客是否移动端浏览器访问的四种方法
    在平常工作开发中,我们通常需要开发出PC端和移动端两个不同的系统,从而根据访问端的不同进入到不同的操作界面中。这就需要我们首先要对访问的客户端进行判断是PC端还是移动端......
  • PHP大文件切割上传并带上进度条功能
    没有修改过php.ini文件的话,默认的上传大小限制为2M,那么该如何上传大文件了,比如说上传一个1G多的大文件,可以使用大文件切割上传的方式来解决。 何为大文件切割上传?原理:利用H......
  • PHP 中使用 TUS 协议来实现大文件的断点续传
    在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。 假如你此时正在上传一个......