type-tools-php
85 строк · 2.6 Кб
1<?php
2
3declare(strict_types=1);
4
5namespace Smoren\TypeTools;
6
7use Closure;
8use Generator;
9
10/**
11* Tool for extracting unique IDs and hashes of any PHP variables and data structures.
12*/
13class UniqueExtractor
14{
15/**
16* Returns unique ID string of given variable by its value and type.
17*
18* If $strict is true:
19* - scalars: result is unique strictly by type;
20* - objects: result is unique by instance;
21* - arrays: result is unique by serialized value;
22* - resources: result is unique by instance.
23*
24* If $strict is false:
25* - scalars: result is unique by value;
26* - objects: result is unique by serialized value;
27* - arrays: result is unique by serialized value.
28* - resources: result is unique by instance.
29*
30* @param mixed $var
31* @param bool $strict
32*
33* @return string
34*/
35public static function getString($var, bool $strict): string
36{
37switch (true) {
38case is_array($var):
39return 'array_'.serialize($var);
40case is_resource($var):
41return 'resource_'.get_resource_type($var).'_'.(string)$var;
42case $var instanceof Generator:
43return 'generator_'.spl_object_id($var);
44case $var instanceof Closure:
45return 'closure_'.spl_object_id($var);
46case is_object($var):
47return 'object_'.($strict ? spl_object_id($var) : serialize($var));
48case gettype($var) === 'boolean':
49return 'boolean_'.(int)$var;
50case $strict:
51return gettype($var).'_'.$var;
52case !$var:
53return 'boolean_0';
54case strval($var) === '1':
55return 'boolean_1';
56case is_numeric($var):
57return 'numeric_'.(float)$var;
58default:
59return 'scalar_'.$var;
60}
61}
62
63/**
64* Returns unique md5 hash string of given variable by its value and type.
65*
66* If $strict is true:
67* - scalars: result is unique strictly by type;
68* - objects: result is unique by instance;
69* - arrays: result is unique by serialized value.
70*
71* If $strict is false:
72* - scalars: result is unique by value;
73* - objects: result is unique by serialized value;
74* - arrays: result is unique by serialized value.
75*
76* @param mixed $var
77* @param bool $strict
78*
79* @return string
80*/
81public static function getHash($var, bool $strict): string
82{
83return md5(static::getString($var, $strict));
84}
85}
86