RandomString   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Test Coverage

Coverage 70.59%

Importance

Changes 0
Metric Value
wmc 19
lcom 0
cbo 0
dl 0
loc 118
ccs 36
cts 51
cp 0.7059
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
B generate() 0 34 9
B resetLocaleTo() 0 45 10
1
<?php
2
/**
3
 * This file is part of the PHP Generics package.
4
 *
5
 * @package Generics
6
 */
7
namespace Generics\Util;
8
9
/**
10
 * This utility class helps to generate a random string
11
 *
12
 * @author Maik Greubel <[email protected]>
13
 *
14
 */
15
class RandomString
16
{
17
18
    /**
19
     * ISO Characters
20
     *
21
     * @final
22
     *
23
     */
24
    const ISO = 1;
25
26
    /**
27
     * ASCII Characters
28
     *
29
     * @final
30
     *
31
     */
32
    const ASCII = 2;
33
34
    /**
35
     * Generate a random string with specific length
36
     *
37
     * @param number $length
38
     *            The length of string to generate
39
     * @param int $allowed
40
     *            Type of allowed characters
41
     * @param boolean $repeatable
42
     *            Whether a character may be reused
43
     *
44
     * @return string The generated string
45
     */
46 3
    public static function generate($length = 8, $allowed = RandomString::ASCII, $repeatable = true): string
47
    {
48 3
        $allowedChars = array();
49
        
50 3
        $currentLocale = setlocale(LC_ALL, "0");
51 3
        if ($allowed == RandomString::ASCII) {
52 3
            setlocale(LC_ALL, "C");
53
        }
54
        
55 3
        for ($i = 32; $i < 256; $i ++) {
56 3
            if (($allowed == RandomString::ASCII && ! ctype_alnum(chr($i))) || (! ctype_print(chr($i)))) {
57 3
                continue;
58
            }
59 3
            $allowedChars[] = $i;
60
        }
61
        
62 3
        self::resetLocaleTo($currentLocale);
63
        
64 3
        $used = array();
65
        
66 3
        $string = "";
67 3
        $i = $length;
68 3
        while ($i > 0) {
69 3
            $index = mt_rand(0, count($allowedChars) - 1);
70 3
            if (! $repeatable && in_array($index, $used)) {
71
                continue;
72
            }
73 3
            $string .= chr($allowedChars[$index]);
74 3
            $used[] = $i;
75 3
            $i --;
76
        }
77
        
78 3
        return $string;
79
    }
80
81
    /**
82
     * Reset the locale settings back to saved vars
83
     *
84
     * @param string $localeSaved
85
     *            String containing the locale infos obtained using setlocale(LC_ALL, '');
86
     */
87 3
    private static function resetLocaleTo($localeSaved)
88
    {
89 3
        $localeData = explode(';', $localeSaved);
90
        
91 3
        foreach ($localeData as $identifier) {
92 3
            if (! strchr($identifier, '=')) {
93 2
                continue;
94
            }
95 1
            $type = $value = null;
96 1
            sscanf($identifier, "%s=%s", $type, $value);
97
            switch ($type) {
98 1
                case 'LC_ALL':
99
                    setlocale(LC_ALL, $value);
100
                    break;
101
                
102 1
                case 'LC_COLLATE':
103
                    setlocale(LC_COLLATE, $value);
104
                    break;
105
                
106 1
                case 'LC_CTYPE':
107
                    setlocale(LC_CTYPE, $value);
108
                    break;
109
                
110 1
                case 'LC_MONETARY':
111
                    setlocale(LC_MONETARY, $value);
112
                    break;
113
                
114 1
                case 'LC_NUMERIC':
115
                    setlocale(LC_NUMERIC, $value);
116
                    break;
117
                
118 1
                case 'LC_TIME':
119
                    setlocale(LC_TIME, $value);
120
                    break;
121
                
122 1
                case 'LC_MESSAGES':
123
                    setlocale(LC_MESSAGES, $value);
124
                    break;
125
                
126
                default:
127
                    ;
128 1
                    break;
129
            }
130
        }
131 3
    }
132
}
133