rmasters/units

使用转换图进行单位转换

dev-master 2013-08-30 09:54 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:39:02 UTC


README

Units是一个用PHP编写的简单的单位转换库。它旨在使用和扩展简单。

安装

可以通过Composer安装Units。将以下行添加到项目composer.json文件下的require部分,然后运行composer update

"rmasters/units": "dev-master"

该包的安装版本列表可在Packagist上找到,并在发布页面上有文档说明。

使用方法

转换类可以直接实例化,也可以使用提供的门面类作为单例使用。每个Convert实例都有自己的单位和转换注册表。

一旦单位和转换已注册(见下文),值可以按以下方式转换

use Units\Facade as Units;

Units::convert('kg', 'lb', 42); // => 92.568

库中提供了一些标准转换。这些函数默认注册到门面单例实例,或者如果提供了,则注册到Convert实例。

// Defined in src/Units/conversions/
Units\register_weights(); // Metric and imperial weights
Units\register_distances(); // Metric and imperial distances

// Registering with a specific Convert instance
$convert = new Convert;
Units\register_distances($convert);

通过附加转换/单位进行扩展

Units使用图模型在单位之间进行转换。例如,下面图中的边(连接)定义了转换(要从单位A转换到B,执行X)。这使得可以在不定义大量转换的情况下跨多个单位进行转换。

mg - g - kg
           \
            lb - oz
              \
               st

在这个图中,要将mg转换为st可以通过执行中间转换到gkglb来实现,而不需要定义特定的mg->st转换。

要定义新的单位和转换,请使用以下代码(通过门面访问)

use \Units\Facade as Units;

// Register new units
Units::register(new Unit('Minute', 'min'));
Units::register(new Unit('Second', 'sec'));

// Record some one way conversions
Units::conversion('min', 'sec', function($min) { return $min * 60; });
Units::conversion('sec', 'min', function($sec) { return $sec / 60; });

// Passing a Unit instance automatically registers it, if not already registered
Units::conversion(new Unit('Hour', 'hr'), 'min', function($hr) { return $hr * 60; });
Units::conversion('min', 'hr', function($min) { return $min / 60; });

Units::convert('min', 'hr', 90); // => 1.5