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: * デフォルトの Equator です.
32: */
33: class DefaultEquator implements Equator
34: {
35: /** このクラスはインスタンス化できません. */
36: private function __construct() {}
37:
38: /**
39: * このクラスの唯一のインスタンスを返します.
40: *
41: * @return DefaultEquator
42: * @codeCoverageIgnore
43: */
44: public static function getInstance()
45: {
46: static $instance = null;
47: if (!isset($instance)) {
48: $instance = new self();
49: }
50: return $instance;
51: }
52:
53: /**
54: * 引数 $var1 と $var2 が等価かどうか調べます.
55: *
56: * 引数の少なくともいずれか一方がオブジェクトまたは配列の場合は
57: * print_r() の結果を比較します.
58: * (hashCode が print_r() の結果を使ってハッシュコードを生成するためです.)
59: *
60: * 引数の少なくともいずれか一方が文字列の場合は両引数を文字列として比較します.
61: * 引数が両方とも数値の場合は == で,
62: * それ以外の場合は === で比較した結果を返します.
63: *
64: * @param mixed $var1
65: * @param mixed $var2
66: * @return bool
67: */
68: public function equate($var1, $var2)
69: {
70: if ($var1 === $var2) {
71: return true;
72: }
73: if (is_object($var1) || is_object($var2) || is_array($var1) || is_array($var2)) {
74: $str1 = print_r($var1, true);
75: $str2 = print_r($var2, true);
76: return $str1 === $str2;
77: }
78: if (is_string($var1) || is_string($var2)) {
79: return strcmp($var1, $var2) === 0;
80: }
81: if (is_numeric($var1) && is_numeric($var2)) {
82: return $var1 == $var2;
83: }
84:
85: return $var1 === $var2;
86: }
87:
88: /**
89: * 指定された値のハッシュ値を返します.
90: * ハッシュ値の計算規則は以下のとおりです.
91: *
92: * - boolean 型にキャストした結果 FALSE となるような引数については 0
93: * - 引数が数値表現の場合はその絶対値
94: * - それ以外の値の場合は, 引数の文字列表現の {@link http://www.php.net/manual/function.md5.php md5()} ハッシュの一部
95: *
96: * @param mixed $var
97: * @return int 引数のハッシュ値
98: */
99: public function hashCode($var)
100: {
101: if (empty($var)) {
102: return 0;
103: }
104: if (is_numeric($var)) {
105: return abs(intval($var));
106: }
107:
108: $str = (is_object($var) || is_array($var)) ? print_r($var, true) : strval($var);
109: return hexdec(substr(md5($str), 22));
110: }
111: }
112: