把运费规则定义为统一的接口,由下单代码传入当前规则。固定运费和满额包邮各自实现计算方法,金额统一用整数分。
声明接口和两种规则
将下列代码保存为 shipping.php。示例固定运费为 800 分,满 5000 分包邮。
<?php interface ShippingRule
{
public function fee(int $subtotal): int;
}
final class FlatRate implements ShippingRule
{
public function fee(int $subtotal): int
{
return 800;
}
}
final class FreeOverThreshold implements ShippingRule
{
public function fee(int $subtotal): int
{
return $subtotal >= 5000 ? 0 : 800;
}
}

规则只计算运费,不写订单。满额边界由实际业务决定。
从允许的规则中选择
把下列函数接到同一文件。规则名由业务配置提供,未知值立即报错。
function shippingFee(string $mode, int $subtotal): int
{
if ($subtotal new FlatRate(),
'threshold' => new FreeOverThreshold(),
default => throw new InvalidArgumentException('Unknown shipping rule'),
};
return $rule->fee($subtotal);
}

示例用到 match,需要 PHP 8。实际系统可在装配层传入规则对象,结算层只依赖接口。
核对满额边界和固定运费
追加以下三行,再执行 php shipping.php。
echo shippingFee('threshold', 4999), PHP_EOL;
echo shippingFee('threshold', 5000), PHP_EOL;
echo shippingFee('flat', 5000), PHP_EOL;
预期依次输出 800、0、800。新增规则时也应保留各自的边界用例。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











