一个小项目的记录:PHP 分账组件

最近整理了一个自己做的小项目——PHP Trade Splitter ,是一个交易/利润分账组件。今天想分享一下,也算是记录自己的小成果,也顺便展示一下技术思路。
为什么会做这个包
说白了,就是因为工作/项目里老是碰到分账逻辑:
- 平台抽成
- 作者收益
- 代理或渠道分润
- 阶梯奖励
- 多级递归计算
以前都是直接写死在业务里,每次改需求都得重构,越改越心累。
于是我想:干脆抽象出来,做一个通用组件,能够:
- 快速调用,一行代码搞定分账
- 可扩展,能注册自定义策略
- 覆盖大多数常见分账规则
顺便用它自己解决问题,也方便别人参考。
架构思路:策略模式解耦
核心思想其实挺简单:策略模式。
-
Splitter
:统一入口,负责分账调度 -
StrategyInterface
:所有分账规则都实现它 -
SplitContext
:封装分账上下文(总额、参与者) -
Allocation
:分账结果对象,支持toArray()
输出
好处就是,如果以后出现新规则,直接写个策略类注册进去就行,不用动核心逻辑。
概念上可以想象成这样:
├─ Splitter.php # 统一入口,负责分账调度
├─ Contracts/
│ └── StrategyInterface.php # 所有分账规则都实现它
├─ Models/
│ ├── Allocation.php # 分账结果对象,支持 `toArray()` 输出
│ └── SplitContext.php # 封装分账上下文(总额、参与者)
└─ Strategies/ # 内置策略类(Percentage, Fixed, Ladder, Recursive)
内置策略概览
组件内置了四种策略,覆盖绝大多数场景:
1️⃣ 百分比分账(Percentage)
按比例分配金额。例如 10% 给平台,90% 给作者。 适合固定比例抽成场景。
2️⃣ 固定金额分账(Fixed)
直接指定每个人的金额。总和不能超过总额。 适合代理固定提成或奖励金额场景。
3️⃣ 阶梯分账(Ladder)
根据金额区间设置不同分成比例,适合阶梯奖励或多级代理。 比如收入低于 1k 用 5%,收入 1k\~5k 用 10%,超过 5k 用 15%。
4️⃣ 递归分账(Recursive)
适合多级渠道分润,每层收益基于上一层金额计算,然后得到净收益。 避免嵌套循环写复杂逻辑,非常清晰。
如果你想看具体代码示例,我在仓库里提供了 demo:tests/demo.php
自定义策略
除了内置策略,你也可以写自己的策略类,只要实现接口就可以注册。 比如你想写一个“全部给某个人”的策略:
概念上就是实现一个接口,然后返回总额给指定对象,调用方式和内置策略一致。
使用体验
- 一行代码即可完成分账
- 分账结果可以直接转换为数组或 JSON,方便存储或返回
- 异常情况和边界条件都有处理,比如比例不合法、总额超出等
分享感想
其实这个包本身逻辑不复杂,但价值在于解决重复痛点:
- 遇到分账问题不用每次重写逻辑
- 可维护性提升
- 自己和别人都能快速上手
所以即便是小组件,也可以体现技术思路和设计能力。
总结
- 这是一个 轻量、灵活、可扩展的 PHP 分账组件
- 核心就是 策略模式 + 可注册自定义策略
- 分享出来,也是记录自己技术历程,同时方便别人参考
如果你也碰到分账痛点,或者想看看策略模式在小项目里的应用,可以去看看