schlaus/schange

类型转换器

1.0.1 2014-08-22 00:24 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:28:15 UTC


README

Build Status Latest Stable Version Total Downloads License

Schange

一个可扩展的类型转换器。

安装

通过 Composer,通过要求 "schlaus/schange": "dev-master" 来安装

或者直接下载并包含 src/schange.php

使用方法

Schange 的作用是尝试通过进行一些转换将变量转换为指定的类型。转换逻辑基于我的用例,在不同情况下可能会有些偏颇或荒谬。请家长自行判断。

语法是

$result = schange::castTo("int", "42");
// OR
$result = schange::castToInt("42");

一旦加载了自定义的转换函数,它就可以以完全相同的方式使用

$result = schange::castTo("banana", 1);
// OR
$result = schange::castToBanana(1);

代码和测试相当直接,应该可以很好地了解进行了哪些类型的转换。支持的类型有 布尔型整数字符串数组浮点型对象。以下是一些示例

string("true") => int(1)
string("true") => array("t", "r", "u", "e")
float(4.5) => int(5)
float(4.4) => int(4)
array("tes", "ting", "!", 123) => string("testing!123")
NULL => empty variable of target type

此外,关联数组可以转换为对象(stdClass 的实例),其中每个键=>值转换为属性=>值。在将对象转换为数组时,只保留公共属性。在将对象转换为字符串时,首先尝试通过 magic __toString() 方法进行转换,如果没有该方法,则首先将对象转换为数组,然后转换为字符串。只有当给定的变量无法转换为请求的类型时,才返回 null,例如尝试将布尔值转换为数组。如果原始变量是 null,则将其转换为请求类型的空实例。

要检查变量是否可以转换为类型,请使用 schange::canCastTo($type, $var);要获取可能的目标类型列表(作为数组),请使用 schange::castable($var);

使用自定义转换器

转换函数接收两个参数:要转换的变量和变量的当前类型。因此,每个函数只能处理转换到一种目标类型。以下是一个示例,说明转换函数应该是什么样子

function($var, $currentType) {
	switch($currentType) {
		case "boolean":
			return null;
			break;
		case "integer":
		case "double":
			$arr = str_split(\schlaus\schange\schange::castToStr($var));
			foreach ($arr as &$val) {
				if ($val !== ".") $val = intval($val);
			}
			return $arr;
			break;
		case "string":
			return str_split($var);
			break;
		case "array":
			return $var;
			break;
		case "object":
			return json_decode(json_encode($var), true);
			break;
		case "NULL":
			return array();
			break;
	}

	return null;
}

转换函数仅在请求的转换无法完成时返回 null,或者在输入一开始就是 null 时,返回目标类型的空实例。没有用于评估变量是否可以转换为其他类型的单独函数,而是通过实际转换函数进行测试,并根据结果是否为 null 返回结果。

自定义转换器可以一次加载一个函数,也可以加载一个转换器数组

schange::loadCaster("targetType", function($var, $currentType) {
	/*
	.
	.	Conversion logic goes here
	.
	*/
});

// OR

schange::loadCaster(array(
	"type1" => function($var, $currentType) { ... },
	"type2" => function($var, $currentType) { ... },
));

一旦加载,自定义函数就可以像默认函数一样使用。自定义转换器比默认转换器具有优先级,例如,如果您为字符串转换注册了一个函数,则将使用该函数而不是默认函数。

在编写自定义函数时,请注意,如果您想支持 PHP 5.3,则不能在函数中使用 self::...,因为在 PHP 5.3 中闭包不会在正确的范围内运行。相反,请使用完全命名空间类名。

免责声明

我为自己的特定目的创建了此类,并希望它对其他人来说不是非常有用。然而,如果您发现它有用并遇到问题,我很乐意帮助。