1: <?php
2: /*
3: * Copyright (c) 2014 @trashtoy
4: * https://github.com/trashtoy/
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a copy of
7: * this software and associated documentation files (the "Software"), to deal in
8: * the Software without restriction, including without limitation the rights to use,
9: * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10: * Software, and to permit persons to whom the Software is furnished to do so,
11: * subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in all
14: * copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18: * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19: * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20: * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21: * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22: */
23: /**
24: * PHP class file.
25: * @auhtor trashtoy
26: * @since 2.0.0
27: */
28: namespace Peach\Util;
29:
30: /**
31: * 値の各種変換を行うユーティリティクラスです.
32: */
33: class Values
34: {
35: /**
36: * このクラスはインスタンス化することができません.
37: */
38: private function __construct() {}
39:
40: /**
41: * 指定された値を整数に変換します.
42: * この関数は変換処理に {@link http://jp1.php.net/manual/ja/function.intval.php intval()} を利用します.
43: *
44: * 最小値が指定されている場合,
45: * 変換後の値が最小値より小さければ最小値を返します.
46: *
47: * 最小値と最大値の両方が指定されている場合,
48: * 変換後の値が最大値より大きければ最大値を返します.
49: *
50: * 最小値が最大値より大きい場合, 最大値の指定は無視されます.
51: * 最大値のみ指定したい場合は, 最小値を NULL にしてください.
52: *
53: * 引数にオブジェクトが指定された場合は 1 として扱います.
54: *
55: * @param mixed $value 変換元の値
56: * @param int $min 最小値 (省略可). 変換後の値がこの値よりも小さい場合は, この値を返す.
57: * @param int $max 最大値 (省略可). 変換後の値がこの値よりも大きい場合は, この値を返す.
58: * @return int 引数を整数に変換した値
59: */
60: public static function intValue($value, $min = null, $max = null)
61: {
62: if (is_object($value)) {
63: return self::intValue(1, $min, $max);
64: }
65: if (!is_int($value)) {
66: $iValue = intval($value);
67: return self::intValue($iValue, $min, $max);
68: }
69: if (isset($min) && isset($max) && $max < $min) {
70: return self::intValue($value, $min);
71: }
72: if (isset($min) && $value < $min) {
73: return $min;
74: }
75: if (isset($max) && $max < $value) {
76: return $max;
77: }
78:
79: return $value;
80: }
81:
82: /**
83: * 指定された値を文字列型に変換します.
84: *
85: * __toString() が定義されているオブジェクトの場合は __toString() の結果,
86: * それ以外のオブジェクトはクラス名を返します.
87: * リソース型の場合は {@link http://jp1.php.net/manual/ja/function.get-resource-type.php get_resource_type()} にリソース ID
88: * を付け足した結果を返します.
89: * それ以外は string 型にキャストした結果を返します.
90: *
91: * @param mixed $value 変換対象の値
92: * @return string 変換後の文字列
93: */
94: public static function stringValue($value)
95: {
96: if (is_object($value)) {
97: return (method_exists($value, '__toString')) ? $value->__toString() : get_class($value);
98: }
99: if (is_resource($value)) {
100: $parts = explode(" ", strval($value));
101: $id = array_pop($parts);
102: return get_resource_type($value) . " " . $id;
103: }
104:
105: return is_string($value) ? $value : strval($value);
106: }
107:
108: /**
109: * 指定された値を配列に変換します.
110: * 引数が配列の場合は引数をそのまま返します.
111: * 配列以外の値の場合は, 第二引数によって結果が変わります.
112: *
113: * - $wrap = TRUE の場合, 引数を長さ 1 の配列として返す.
114: * - $wrap = FALSE の場合, 空の配列を返す.
115: *
116: * デフォルトでは $wrap = FALSE となります.
117: *
118: * @param mixed $value 変換元の値.
119: * @param bool $wrap 配列以外の値の場合に, 長さ 1 の配列に変換する場合は TRUE
120: * @return array 変換後の配列
121: */
122: public static function arrayValue($value, $wrap = false)
123: {
124: if (is_array($value)) {
125: return $value;
126: }
127:
128: return $wrap ? array($value) : array();
129: }
130:
131: /**
132: * 指定された値を bool 型に変換します.
133: * この関数は "Yes", "No", "True", "False", "OK", "NG" などの文字列を
134: * bool に変換する用途を想定したものです.
135: *
136: * 引数が bool 型の場合は引数をそのまま返します.
137: *
138: * 引数が文字列型の場合,
139: * 先頭の 1 バイトが T, Y, O のいずれかの場合は TRUE,
140: * 先頭の 1 バイトが F, N のいずれかの場合は FALSE,
141: * それ以外は文字列を bool にキャストした結果を返します.
142: * (大文字・小文字は区別しません)
143: *
144: * 引数が数値型の場合, bool にキャストした結果を返します.
145: * すなわち 0 以外の値は TRUE, 0 の場合は FALSE を返します.
146: *
147: * 以上の条件にあてはまらない値の場合,
148: * $defaultValue が NULL または未指定の場合は第 1 引数を
149: * bool にキャストした結果を返します.
150: * $defaultValue が指定されている場合はその bool 値を返します.
151: *
152: * @param mixed $value 変換対象の値
153: * @param bool $defaultValue デフォルトの返り値
154: * @return bool 変換後の bool 値
155: */
156: public static function boolValue($value, $defaultValue = null)
157: {
158: if (is_bool($value)) {
159: return $value;
160: }
161: if (is_string($value)) {
162: return self::stringToBool($value, $defaultValue);
163: }
164: if (is_numeric($value)) {
165: return (bool) $value;
166: }
167:
168: return self::handleBoolValue($value, $defaultValue);
169: }
170:
171: /**
172: * 文字列を bool 型にキャストします.
173: * @param string $value
174: * @param bool $defaultValue
175: * @return bool
176: */
177: private static function stringToBool($value, $defaultValue = null)
178: {
179: // @codeCoverageIgnoreStart
180: static $tPrefix = null, $fPrefix = null;
181: if (!isset($tPrefix)) {
182: $tPrefix = array("t", "y", "o");
183: $fPrefix = array("f", "n");
184: }
185: // @codeCoverageIgnoreEnd
186:
187: $prefix = strtolower(substr($value, 0, 1));
188: if (in_array($prefix, $tPrefix)) {
189: return true;
190: }
191: if (in_array($prefix, $fPrefix)) {
192: return false;
193: }
194:
195: return self::handleBoolValue($value, $defaultValue);
196: }
197:
198: /**
199: * デフォルト値に NULL 以外の値が指定されている場合はデフォルト値の bool 表現を,
200: * そうでない場合は第一引数の bool 表現を返します.
201: * @param mixed $value
202: * @param bool $defaultValue
203: * @return bool
204: */
205: private static function handleBoolValue($value, $defaultValue = null)
206: {
207: return isset($defaultValue) ? (bool) $defaultValue : (bool) $value;
208: }
209:
210: /**
211: * 指定された値の型を返します.
212: * 内部関数の {@link http://jp1.php.net/manual/ja/function.gettype.php gettype()} とほぼ同じ動作をしますが,
213: * 引数にオブジェクトを指定した場合に文字列 "object"
214: * ではなくその値のクラス名を返すところが異なります.
215: *
216: * @param mixed $var 検査対象の値
217: */
218: public static function getType($var)
219: {
220: return is_object($var) ? get_class($var) : gettype($var);
221: }
222: }
223: