helvetitec/money

Fowler的Money模式的PHP实现

v4.5.1 2024-06-21 21:12 UTC

This package is auto-updated.

Last update: 2024-09-21 21:39:53 UTC


README

Latest Version GitHub Workflow Status Total Downloads

Email

Money PHP

PHP库,使金钱操作更安全、更简单、更有趣!

"如果我每次看到有人用FLOAT存储货币就有一分钱,我就会有999.997634美元。" -- Bill Karwin

简而言之:你不应该用浮点数表示货币值。无论何时你需要表示金钱,请使用此Money值对象。自3.0版本起,此库使用字符串内部以支持无限整数。

<?php

use Money\Money;

$fiveEur = Money::EUR(500);
$tenEur = $fiveEur->add($fiveEur);

list($part1, $part2, $part3) = $tenEur->allocate([1, 1, 1]);
assert($part1->equals(Money::EUR(334)));
assert($part2->equals(Money::EUR(333)));
assert($part3->equals(Money::EUR(333)));

文档可在http://moneyphp.org找到

需求

此库需要BCMath PHP扩展。对于特定功能,可能存在其他依赖项,例如Swap交换实现,请查阅文档以获取更多信息。

版本4需要PHP 8.0。对于旧版本的PHP,请使用此库的3.0版本。从4.5版本开始,此包将仅支持PHP自身实际接收更新的版本。如果您想使用旧版本的PHP,当然可以使用此包的旧版本。

安装

通过Composer

$ composer require moneyphp/money

功能

  • JSON序列化
  • 利用不同的透明计算逻辑支持大整数(在可用时,bcmath、gmp、纯PHP)
  • 金钱格式化(包括intl格式化器)
  • 货币仓库(包括ISO货币)
  • 金钱兑换(包括Swap实现)

文档

请参阅官方文档

测试

我们尝试通过使用phpunit来遵循TDD测试此库。

$ composer test

在Docker中运行测试

金钱需要一系列依赖项,因此您可能希望在Docker中运行它。

首先,在本地构建镜像

$ docker build -t moneyphp .

然后运行测试

$ docker run --rm -it -v $PWD:/app -w /app moneyphp vendor/bin/phpunit --exclude-group segmentation

贡献

我们非常希望看到您帮助我们使此库变得更好。请注意,我们不在类名中使用后缀和前缀,因此不是CurrenciesInterface,而是Currencies。除此之外,Style CI将帮助您使用与我们相同的代码风格。请创建PR时提供测试,并在提交问题时提供清晰的错误描述。

安全性

如果您发现任何与安全相关的问题,请通过team@moneyphp.org与我们联系。

许可

MIT许可证(MIT)。请参阅许可文件以获取更多信息。

致谢

此库深受Martin Fowler的Money模式的启发。特别感谢Mathias Verraes,没有他的贡献(代码和通过他的博客),此库不会处于现在的位置。