mibo / properties
用于通用和/或自定义属性的PHP库
Requires
- php: ^8.2
- ramsey/uuid: ^4.7
Requires (Dev)
- jetbrains/phpstorm-attributes: ^1.0
- phpbench/phpbench: ^1.2
- phpstan/phpstan: ^1.5
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/php-invoker: ^4.0
- phpunit/phpunit: ^10.5
- slevomat/coding-standard: ^8.11
- squizlabs/php_codesniffer: ^3.6
README
是的。这是一个计算器。
然而,其主要目的并不是计算,而是帮助开发者在进行浮点数计算时获得更准确的结果。此外,该库包含几个函数
- 计算属性
- 添加、减去、乘法和除法运算
- 更精确的结果
- 尝试使用整数而不是浮点数
- 在非必要时不进行除法操作 [1]
- 数量
- 如长度、时间等数量已提供(更多功能即将推出)
- 乘法和除法运算生成新的数量(长度 * 长度 = 面积)
- SI和单位
- SI前缀(Centi、Deci、Kilo等)
- 可以使用不同数量的单位,而无需担心转换。单位可以自动转换为数量的基本单位 [2]
- 转换
- 在数量的不同单位之间进行转换
- 无需担心转换。属性实现了
convertToUnit
方法,该方法将数量转换为指定的单位。开发人员无需在计算之前转换属性,因为转换是自动完成的。
[1] 库尝试在非必要时不进行除法操作。例如,当计算多个数字时,如果调用除法操作,库将存储除法的结果,并将其用作下一个数字的乘数。只有在最终调用真实结果时,才会进行除法。 [2] 当在100厘米上添加1米时,结果是200厘米。原始单位被保留。
所有单位都是基于默认SI单位进行计算,并有其值。SI单位默认乘以1。
该库不对非SI单位进行覆盖。(它们(非SI)只是为了完整性而存在。)
安装
composer require mibo/properties
使用
$length = new Length(10, Meter::get()); $length->add(...); $length->getValue();
库的逻辑
由于库包含一些不同的功能,因此理解其背后的逻辑非常重要。
每个功能都与其他功能分开,因此每个类都有自己的责任。
计算器
计算器可以执行任何类型的计算。它可以是一个简单的加法,也可以是一个更复杂的计算,包括乘法、除法等。计算器负责计算结果。它不关心单位或数字的数量。它只计算结果。
数学
数学只是PHP原生数学函数的类表示。类的主要目的是不调用公共函数,而是使用静态类。
属性计算器
属性计算器负责使用属性进行计算。其最复杂的函数是两个或多个属性的除法和乘法,因为它必须生成具有不同数量的新属性。例如,当乘以长度时,结果是面积。属性计算器负责生成面积属性。
可以通过设置其公共属性“数量”中的不同数量来覆盖属性计算器。
单位转换器
一些单位,或者说数量,并不容易转换。转换长度听起来很简单,因为所有单位都共享相同的0值。比如……零就是零,对吧?那么,让我们看看温度。0摄氏度不等于0华氏度。所以,单位转换器负责转换单位。一些单位不仅仅是应用系数的值。
可以通过自定义转换闭包扩展UnitConvertor,用于特定的数量。
数量
数量是数量的表示。每个数量都应该有自己的类。数量类包含有关其默认单位的信息(由PropertyCalc使用),以及要创建的属性。
一些数量是派生的(如速度),因此它们带有DerivedQuantity
接口,这使得它们实现一个方法来从其他属性检索用于计算属性的方程。这些方程由PropertyCalc使用。
单位
单位是单位的表示,并按其数量分组。某些单位可能适用于多个数量,但是必须使用属于所需数量的正确单位。
单位通常存储其名称和符号。
单位仅创建一次 - 它是单例。
属性
属性存储其真实值(整数或浮点数)——在数值属性的情况下。
它们存储其数量和单位。
可以说,它们的主要目的是存储通常存储在变量中的值。
属性是开发者应使用的主要对象。它们确实提供了用于在它们上执行数学运算的常用方法。
值
可能是库中最复杂和重要的部分,它不打算在库外普遍使用,就是类Value。Value实际上是在属性中包装值的包装器,这意味着,属性不存储整数或浮点数的'值',而是存储Value对象,并且仅存储那个真正的值。
Value(大写V以区分值)负责存储值。它可以设置为整数(仅允许整数),或双精度浮点数(真正的双精度浮点数),或浮点数(这是普通的浮点数,没有限制),实际上,任何十进制数。可以指定数字的精度。
此外,Value可以设置为不同的基数。默认情况下,当然,使用十进制。但可以使用任何其他基数。
Value负责优化计算,同时尝试避免使用浮点数。必须理解,由于尝试避免使用浮点数,Value可能比直接使用浮点数慢。
必须理解,由于Value更精确,一些测试可能会失败。例如,当按顺序执行1/3*3时,在整数属性上,结果是0(1/3是0,0*3是0)。然而,当使用Value时,Value将第一个除数(3)存储到“存储”中,一旦意识到需要相同值的乘法,Value就会移除除数而不进行乘法,结果为整数1。(这是一个非常简单的例子,但它说明了这一点)
未来可能添加哪些内容?
库将提供更多数量和单位。目标是添加所有由SI指定的主要数量。
库将有多个扩展(或更准确地说,库依赖项),将提供更多数量(如价格)。
更改、更新等。
库不保证现在导致整数的所有计算在将来也会导致整数。我们必须以某种方式满足速度和精度的要求。
库不涵盖非SI单位和它们的转换。
库不涵盖计算速度。
该库不涵盖使用非十进制基数。这是一个很好的功能,但不是优先考虑的。如果发现错误,将会修复,但库的其他部分优先处理。