mibo/properties

用于通用和/或自定义属性的PHP库

资助包维护!
4513


README

codecov

是的。这是一个计算器。

然而,其主要目的并不是计算,而是帮助开发者在进行浮点数计算时获得更准确的结果。此外,该库包含几个函数

  1. 计算属性
    • 添加、减去、乘法和除法运算
    • 更精确的结果
      • 尝试使用整数而不是浮点数
      • 在非必要时不进行除法操作 [1]
  2. 数量
    • 如长度、时间等数量已提供(更多功能即将推出)
    • 乘法和除法运算生成新的数量(长度 * 长度 = 面积)
  3. SI和单位
    • SI前缀(Centi、Deci、Kilo等)
    • 可以使用不同数量的单位,而无需担心转换。单位可以自动转换为数量的基本单位 [2]
  4. 转换
    • 在数量的不同单位之间进行转换
    • 无需担心转换。属性实现了 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单位和它们的转换。

库不涵盖计算速度。

该库不涵盖使用非十进制基数。这是一个很好的功能,但不是优先考虑的。如果发现错误,将会修复,但库的其他部分优先处理。