Completed
Pull Request — develop (#1492)
by Zack
33:18 queued 12:17
created
PHPCompatibility/Sniffs/Variables/ForbiddenGlobalVariableVariableSniff.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -29,96 +29,96 @@
 block discarded – undo
29 29
 class ForbiddenGlobalVariableVariableSniff extends Sniff
30 30
 {
31 31
 
32
-    /**
33
-     * Returns an array of tokens this test wants to listen for.
34
-     *
35
-     * @return array
36
-     */
37
-    public function register()
38
-    {
39
-        return array(\T_GLOBAL);
40
-    }
32
+	/**
33
+	 * Returns an array of tokens this test wants to listen for.
34
+	 *
35
+	 * @return array
36
+	 */
37
+	public function register()
38
+	{
39
+		return array(\T_GLOBAL);
40
+	}
41 41
 
42
-    /**
43
-     * Processes this test, when one of its tokens is encountered.
44
-     *
45
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
46
-     * @param int                   $stackPtr  The position of the current token in the
47
-     *                                         stack passed in $tokens.
48
-     *
49
-     * @return void
50
-     */
51
-    public function process(File $phpcsFile, $stackPtr)
52
-    {
53
-        if ($this->supportsAbove('7.0') === false) {
54
-            return;
55
-        }
42
+	/**
43
+	 * Processes this test, when one of its tokens is encountered.
44
+	 *
45
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
46
+	 * @param int                   $stackPtr  The position of the current token in the
47
+	 *                                         stack passed in $tokens.
48
+	 *
49
+	 * @return void
50
+	 */
51
+	public function process(File $phpcsFile, $stackPtr)
52
+	{
53
+		if ($this->supportsAbove('7.0') === false) {
54
+			return;
55
+		}
56 56
 
57
-        $tokens         = $phpcsFile->getTokens();
58
-        $endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr + 1));
59
-        if ($endOfStatement === false) {
60
-            // No semi-colon - live coding.
61
-            return;
62
-        }
57
+		$tokens         = $phpcsFile->getTokens();
58
+		$endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr + 1));
59
+		if ($endOfStatement === false) {
60
+			// No semi-colon - live coding.
61
+			return;
62
+		}
63 63
 
64
-        for ($ptr = ($stackPtr + 1); $ptr <= $endOfStatement; $ptr++) {
65
-            $errorThrown = false;
66
-            $nextComma   = $phpcsFile->findNext(\T_COMMA, $ptr, $endOfStatement, false, null, true);
67
-            $varEnd      = ($nextComma === false) ? $endOfStatement : $nextComma;
68
-            $variable    = $phpcsFile->findNext(\T_VARIABLE, $ptr, $varEnd);
69
-            $varString   = trim($phpcsFile->getTokensAsString($ptr, ($varEnd - $ptr)));
70
-            $data        = array($varString);
64
+		for ($ptr = ($stackPtr + 1); $ptr <= $endOfStatement; $ptr++) {
65
+			$errorThrown = false;
66
+			$nextComma   = $phpcsFile->findNext(\T_COMMA, $ptr, $endOfStatement, false, null, true);
67
+			$varEnd      = ($nextComma === false) ? $endOfStatement : $nextComma;
68
+			$variable    = $phpcsFile->findNext(\T_VARIABLE, $ptr, $varEnd);
69
+			$varString   = trim($phpcsFile->getTokensAsString($ptr, ($varEnd - $ptr)));
70
+			$data        = array($varString);
71 71
 
72
-            if ($variable !== false) {
72
+			if ($variable !== false) {
73 73
 
74
-                $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($variable - 1), $ptr, true);
74
+				$prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($variable - 1), $ptr, true);
75 75
 
76
-                if ($prev !== false && $tokens[$prev]['type'] === 'T_DOLLAR') {
76
+				if ($prev !== false && $tokens[$prev]['type'] === 'T_DOLLAR') {
77 77
 
78
-                    $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($variable + 1), $varEnd, true);
78
+					$next = $phpcsFile->findNext(Tokens::$emptyTokens, ($variable + 1), $varEnd, true);
79 79
 
80
-                    if ($next !== false
81
-                        && \in_array($tokens[$next]['code'], array(\T_OPEN_SQUARE_BRACKET, \T_OBJECT_OPERATOR, \T_DOUBLE_COLON), true) === true
82
-                    ) {
83
-                        $phpcsFile->addError(
84
-                            'Global with variable variables is not allowed since PHP 7.0. Found %s',
85
-                            $variable,
86
-                            'Found',
87
-                            $data
88
-                        );
89
-                        $errorThrown = true;
90
-                    } else {
91
-                        $phpcsFile->addWarning(
92
-                            'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s',
93
-                            $variable,
94
-                            'NonBareVariableFound',
95
-                            $data
96
-                        );
97
-                        $errorThrown = true;
98
-                    }
99
-                }
100
-            }
80
+					if ($next !== false
81
+						&& \in_array($tokens[$next]['code'], array(\T_OPEN_SQUARE_BRACKET, \T_OBJECT_OPERATOR, \T_DOUBLE_COLON), true) === true
82
+					) {
83
+						$phpcsFile->addError(
84
+							'Global with variable variables is not allowed since PHP 7.0. Found %s',
85
+							$variable,
86
+							'Found',
87
+							$data
88
+						);
89
+						$errorThrown = true;
90
+					} else {
91
+						$phpcsFile->addWarning(
92
+							'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s',
93
+							$variable,
94
+							'NonBareVariableFound',
95
+							$data
96
+						);
97
+						$errorThrown = true;
98
+					}
99
+				}
100
+			}
101 101
 
102
-            if ($errorThrown === false) {
103
-                $dollar = $phpcsFile->findNext(\T_DOLLAR, $ptr, $varEnd);
104
-                if ($dollar !== false) {
105
-                    $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($dollar + 1), $varEnd, true);
106
-                    if ($tokens[$next]['code'] === \T_OPEN_CURLY_BRACKET) {
107
-                        $phpcsFile->addWarning(
108
-                            'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s',
109
-                            $dollar,
110
-                            'NonBareVariableFound',
111
-                            $data
112
-                        );
113
-                    }
114
-                }
115
-            }
102
+			if ($errorThrown === false) {
103
+				$dollar = $phpcsFile->findNext(\T_DOLLAR, $ptr, $varEnd);
104
+				if ($dollar !== false) {
105
+					$next = $phpcsFile->findNext(Tokens::$emptyTokens, ($dollar + 1), $varEnd, true);
106
+					if ($tokens[$next]['code'] === \T_OPEN_CURLY_BRACKET) {
107
+						$phpcsFile->addWarning(
108
+							'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s',
109
+							$dollar,
110
+							'NonBareVariableFound',
111
+							$data
112
+						);
113
+					}
114
+				}
115
+			}
116 116
 
117
-            // Move the stack pointer forward to the next variable for multi-variable statements.
118
-            if ($nextComma === false) {
119
-                break;
120
-            }
121
-            $ptr = $nextComma;
122
-        }
123
-    }
117
+			// Move the stack pointer forward to the next variable for multi-variable statements.
118
+			if ($nextComma === false) {
119
+				break;
120
+			}
121
+			$ptr = $nextComma;
122
+		}
123
+	}
124 124
 }
Please login to merge, or discard this patch.
PHPCompatibility/Sniffs/Variables/RemovedPredefinedGlobalVariablesSniff.php 1 patch
Indentation   +260 added lines, -260 removed lines patch added patch discarded remove patch
@@ -26,268 +26,268 @@
 block discarded – undo
26 26
 class RemovedPredefinedGlobalVariablesSniff extends AbstractRemovedFeatureSniff
27 27
 {
28 28
 
29
-    /**
30
-     * A list of removed global variables with their alternative, if any.
31
-     *
32
-     * The array lists : version number with false (deprecated) and true (removed).
33
-     * If's sufficient to list the first version where the variable was deprecated/removed.
34
-     *
35
-     * @var array(string|null)
36
-     */
37
-    protected $removedGlobalVariables = array(
38
-        'HTTP_POST_VARS' => array(
39
-            '5.3' => false,
40
-            '5.4' => true,
41
-            'alternative' => '$_POST',
42
-        ),
43
-        'HTTP_GET_VARS' => array(
44
-            '5.3' => false,
45
-            '5.4' => true,
46
-            'alternative' => '$_GET',
47
-        ),
48
-        'HTTP_ENV_VARS' => array(
49
-            '5.3' => false,
50
-            '5.4' => true,
51
-            'alternative' => '$_ENV',
52
-        ),
53
-        'HTTP_SERVER_VARS' => array(
54
-            '5.3' => false,
55
-            '5.4' => true,
56
-            'alternative' => '$_SERVER',
57
-        ),
58
-        'HTTP_COOKIE_VARS' => array(
59
-            '5.3' => false,
60
-            '5.4' => true,
61
-            'alternative' => '$_COOKIE',
62
-        ),
63
-        'HTTP_SESSION_VARS' => array(
64
-            '5.3' => false,
65
-            '5.4' => true,
66
-            'alternative' => '$_SESSION',
67
-        ),
68
-        'HTTP_POST_FILES' => array(
69
-            '5.3' => false,
70
-            '5.4' => true,
71
-            'alternative' => '$_FILES',
72
-        ),
73
-
74
-        'HTTP_RAW_POST_DATA' => array(
75
-            '5.6' => false,
76
-            '7.0' => true,
77
-            'alternative' => 'php://input',
78
-        ),
79
-
80
-        'php_errormsg' => array(
81
-            '7.2' => false,
82
-            'alternative' => 'error_get_last()',
83
-        ),
84
-    );
85
-
86
-
87
-    /**
88
-     * Returns an array of tokens this test wants to listen for.
89
-     *
90
-     * @return array
91
-     */
92
-    public function register()
93
-    {
94
-        return array(\T_VARIABLE);
95
-    }
96
-
97
-
98
-    /**
99
-     * Processes this test, when one of its tokens is encountered.
100
-     *
101
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
102
-     * @param int                   $stackPtr  The position of the current token in the
103
-     *                                         stack passed in $tokens.
104
-     *
105
-     * @return void
106
-     */
107
-    public function process(File $phpcsFile, $stackPtr)
108
-    {
109
-        if ($this->supportsAbove('5.3') === false) {
110
-            return;
111
-        }
112
-
113
-        $tokens  = $phpcsFile->getTokens();
114
-        $varName = substr($tokens[$stackPtr]['content'], 1);
115
-
116
-        if (isset($this->removedGlobalVariables[$varName]) === false) {
117
-            return;
118
-        }
119
-
120
-        if ($this->isClassProperty($phpcsFile, $stackPtr) === true) {
121
-            // Ok, so this was a class property declaration, not our concern.
122
-            return;
123
-        }
124
-
125
-        // Check for static usage of class properties shadowing the removed global variables.
126
-        if ($this->inClassScope($phpcsFile, $stackPtr, false) === true) {
127
-            $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true);
128
-            if ($prevToken !== false && $tokens[$prevToken]['code'] === \T_DOUBLE_COLON) {
129
-                return;
130
-            }
131
-        }
132
-
133
-        // Do some additional checks for the $php_errormsg variable.
134
-        if ($varName === 'php_errormsg'
135
-            && $this->isTargetPHPErrormsgVar($phpcsFile, $stackPtr, $tokens) === false
136
-        ) {
137
-            return;
138
-        }
139
-
140
-        // Still here, so throw an error/warning.
141
-        $itemInfo = array(
142
-            'name' => $varName,
143
-        );
144
-        $this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
145
-    }
146
-
147
-
148
-    /**
149
-     * Get the relevant sub-array for a specific item from a multi-dimensional array.
150
-     *
151
-     * @param array $itemInfo Base information about the item.
152
-     *
153
-     * @return array Version and other information about the item.
154
-     */
155
-    public function getItemArray(array $itemInfo)
156
-    {
157
-        return $this->removedGlobalVariables[$itemInfo['name']];
158
-    }
159
-
160
-
161
-    /**
162
-     * Get the error message template for this sniff.
163
-     *
164
-     * @return string
165
-     */
166
-    protected function getErrorMsgTemplate()
167
-    {
168
-        return "Global variable '\$%s' is ";
169
-    }
170
-
171
-
172
-    /**
173
-     * Filter the error message before it's passed to PHPCS.
174
-     *
175
-     * @param string $error     The error message which was created.
176
-     * @param array  $itemInfo  Base information about the item this error message applies to.
177
-     * @param array  $errorInfo Detail information about an item this error message applies to.
178
-     *
179
-     * @return string
180
-     */
181
-    protected function filterErrorMsg($error, array $itemInfo, array $errorInfo)
182
-    {
183
-        if ($itemInfo['name'] === 'php_errormsg') {
184
-            $error = str_replace('Global', 'The', $error);
185
-        }
186
-        return $error;
187
-    }
188
-
189
-    /**
190
-     * Run some additional checks for the `$php_errormsg` variable.
191
-     *
192
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
193
-     * @param int                   $stackPtr  The position of the current token in the
194
-     *                                         stack passed in $tokens.
195
-     * @param array                 $tokens    Token array of the current file.
196
-     *
197
-     * @return bool
198
-     */
199
-    private function isTargetPHPErrormsgVar(File $phpcsFile, $stackPtr, array $tokens)
200
-    {
201
-        $scopeStart = 0;
202
-
203
-        /*
29
+	/**
30
+	 * A list of removed global variables with their alternative, if any.
31
+	 *
32
+	 * The array lists : version number with false (deprecated) and true (removed).
33
+	 * If's sufficient to list the first version where the variable was deprecated/removed.
34
+	 *
35
+	 * @var array(string|null)
36
+	 */
37
+	protected $removedGlobalVariables = array(
38
+		'HTTP_POST_VARS' => array(
39
+			'5.3' => false,
40
+			'5.4' => true,
41
+			'alternative' => '$_POST',
42
+		),
43
+		'HTTP_GET_VARS' => array(
44
+			'5.3' => false,
45
+			'5.4' => true,
46
+			'alternative' => '$_GET',
47
+		),
48
+		'HTTP_ENV_VARS' => array(
49
+			'5.3' => false,
50
+			'5.4' => true,
51
+			'alternative' => '$_ENV',
52
+		),
53
+		'HTTP_SERVER_VARS' => array(
54
+			'5.3' => false,
55
+			'5.4' => true,
56
+			'alternative' => '$_SERVER',
57
+		),
58
+		'HTTP_COOKIE_VARS' => array(
59
+			'5.3' => false,
60
+			'5.4' => true,
61
+			'alternative' => '$_COOKIE',
62
+		),
63
+		'HTTP_SESSION_VARS' => array(
64
+			'5.3' => false,
65
+			'5.4' => true,
66
+			'alternative' => '$_SESSION',
67
+		),
68
+		'HTTP_POST_FILES' => array(
69
+			'5.3' => false,
70
+			'5.4' => true,
71
+			'alternative' => '$_FILES',
72
+		),
73
+
74
+		'HTTP_RAW_POST_DATA' => array(
75
+			'5.6' => false,
76
+			'7.0' => true,
77
+			'alternative' => 'php://input',
78
+		),
79
+
80
+		'php_errormsg' => array(
81
+			'7.2' => false,
82
+			'alternative' => 'error_get_last()',
83
+		),
84
+	);
85
+
86
+
87
+	/**
88
+	 * Returns an array of tokens this test wants to listen for.
89
+	 *
90
+	 * @return array
91
+	 */
92
+	public function register()
93
+	{
94
+		return array(\T_VARIABLE);
95
+	}
96
+
97
+
98
+	/**
99
+	 * Processes this test, when one of its tokens is encountered.
100
+	 *
101
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
102
+	 * @param int                   $stackPtr  The position of the current token in the
103
+	 *                                         stack passed in $tokens.
104
+	 *
105
+	 * @return void
106
+	 */
107
+	public function process(File $phpcsFile, $stackPtr)
108
+	{
109
+		if ($this->supportsAbove('5.3') === false) {
110
+			return;
111
+		}
112
+
113
+		$tokens  = $phpcsFile->getTokens();
114
+		$varName = substr($tokens[$stackPtr]['content'], 1);
115
+
116
+		if (isset($this->removedGlobalVariables[$varName]) === false) {
117
+			return;
118
+		}
119
+
120
+		if ($this->isClassProperty($phpcsFile, $stackPtr) === true) {
121
+			// Ok, so this was a class property declaration, not our concern.
122
+			return;
123
+		}
124
+
125
+		// Check for static usage of class properties shadowing the removed global variables.
126
+		if ($this->inClassScope($phpcsFile, $stackPtr, false) === true) {
127
+			$prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true);
128
+			if ($prevToken !== false && $tokens[$prevToken]['code'] === \T_DOUBLE_COLON) {
129
+				return;
130
+			}
131
+		}
132
+
133
+		// Do some additional checks for the $php_errormsg variable.
134
+		if ($varName === 'php_errormsg'
135
+			&& $this->isTargetPHPErrormsgVar($phpcsFile, $stackPtr, $tokens) === false
136
+		) {
137
+			return;
138
+		}
139
+
140
+		// Still here, so throw an error/warning.
141
+		$itemInfo = array(
142
+			'name' => $varName,
143
+		);
144
+		$this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
145
+	}
146
+
147
+
148
+	/**
149
+	 * Get the relevant sub-array for a specific item from a multi-dimensional array.
150
+	 *
151
+	 * @param array $itemInfo Base information about the item.
152
+	 *
153
+	 * @return array Version and other information about the item.
154
+	 */
155
+	public function getItemArray(array $itemInfo)
156
+	{
157
+		return $this->removedGlobalVariables[$itemInfo['name']];
158
+	}
159
+
160
+
161
+	/**
162
+	 * Get the error message template for this sniff.
163
+	 *
164
+	 * @return string
165
+	 */
166
+	protected function getErrorMsgTemplate()
167
+	{
168
+		return "Global variable '\$%s' is ";
169
+	}
170
+
171
+
172
+	/**
173
+	 * Filter the error message before it's passed to PHPCS.
174
+	 *
175
+	 * @param string $error     The error message which was created.
176
+	 * @param array  $itemInfo  Base information about the item this error message applies to.
177
+	 * @param array  $errorInfo Detail information about an item this error message applies to.
178
+	 *
179
+	 * @return string
180
+	 */
181
+	protected function filterErrorMsg($error, array $itemInfo, array $errorInfo)
182
+	{
183
+		if ($itemInfo['name'] === 'php_errormsg') {
184
+			$error = str_replace('Global', 'The', $error);
185
+		}
186
+		return $error;
187
+	}
188
+
189
+	/**
190
+	 * Run some additional checks for the `$php_errormsg` variable.
191
+	 *
192
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
193
+	 * @param int                   $stackPtr  The position of the current token in the
194
+	 *                                         stack passed in $tokens.
195
+	 * @param array                 $tokens    Token array of the current file.
196
+	 *
197
+	 * @return bool
198
+	 */
199
+	private function isTargetPHPErrormsgVar(File $phpcsFile, $stackPtr, array $tokens)
200
+	{
201
+		$scopeStart = 0;
202
+
203
+		/*
204 204
          * If the variable is detected within the scope of a function/closure, limit the checking.
205 205
          */
206
-        $function = $phpcsFile->getCondition($stackPtr, \T_CLOSURE);
207
-        if ($function === false) {
208
-            $function = $phpcsFile->getCondition($stackPtr, \T_FUNCTION);
209
-        }
210
-
211
-        // It could also be a function param, which is not in the function scope.
212
-        if ($function === false && isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
213
-            $nestedParentheses = $tokens[$stackPtr]['nested_parenthesis'];
214
-            $parenthesisCloser = end($nestedParentheses);
215
-            if (isset($tokens[$parenthesisCloser]['parenthesis_owner'])
216
-                && ($tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_FUNCTION
217
-                    || $tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_CLOSURE)
218
-            ) {
219
-                $function = $tokens[$parenthesisCloser]['parenthesis_owner'];
220
-            }
221
-        }
222
-
223
-        if ($function !== false) {
224
-            $scopeStart = $tokens[$function]['scope_opener'];
225
-        }
226
-
227
-        /*
206
+		$function = $phpcsFile->getCondition($stackPtr, \T_CLOSURE);
207
+		if ($function === false) {
208
+			$function = $phpcsFile->getCondition($stackPtr, \T_FUNCTION);
209
+		}
210
+
211
+		// It could also be a function param, which is not in the function scope.
212
+		if ($function === false && isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
213
+			$nestedParentheses = $tokens[$stackPtr]['nested_parenthesis'];
214
+			$parenthesisCloser = end($nestedParentheses);
215
+			if (isset($tokens[$parenthesisCloser]['parenthesis_owner'])
216
+				&& ($tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_FUNCTION
217
+					|| $tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_CLOSURE)
218
+			) {
219
+				$function = $tokens[$parenthesisCloser]['parenthesis_owner'];
220
+			}
221
+		}
222
+
223
+		if ($function !== false) {
224
+			$scopeStart = $tokens[$function]['scope_opener'];
225
+		}
226
+
227
+		/*
228 228
          * Now, let's do some additional checks.
229 229
          */
230
-        $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true);
231
-
232
-        // Is the variable being used as an array ?
233
-        if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_OPEN_SQUARE_BRACKET) {
234
-            // The PHP native variable is a string, so this is probably not it
235
-            // (except for array access to string, but why would you in this case ?).
236
-            return false;
237
-        }
238
-
239
-        // Is this a variable assignment ?
240
-        if ($nextNonEmpty !== false
241
-            && isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true
242
-        ) {
243
-            return false;
244
-        }
245
-
246
-        // Is this a function param shadowing the PHP native one ?
247
-        if ($function !== false) {
248
-            $parameters = PHPCSHelper::getMethodParameters($phpcsFile, $function);
249
-            if (\is_array($parameters) === true && empty($parameters) === false) {
250
-                foreach ($parameters as $param) {
251
-                    if ($param['name'] === '$php_errormsg') {
252
-                        return false;
253
-                    }
254
-                }
255
-            }
256
-        }
257
-
258
-        $skipPast = array(
259
-            'T_CLASS'      => true,
260
-            'T_ANON_CLASS' => true,
261
-            'T_INTERFACE'  => true,
262
-            'T_TRAIT'      => true,
263
-            'T_FUNCTION'   => true,
264
-            'T_CLOSURE'    => true,
265
-        );
266
-
267
-        // Walk back and see if there is an assignment to the variable within the same scope.
268
-        for ($i = ($stackPtr - 1); $i >= $scopeStart; $i--) {
269
-            if ($tokens[$i]['code'] === \T_CLOSE_CURLY_BRACKET
270
-                && isset($tokens[$i]['scope_condition'])
271
-                && isset($skipPast[$tokens[$tokens[$i]['scope_condition']]['type']])
272
-            ) {
273
-                // Skip past functions, classes etc.
274
-                $i = $tokens[$i]['scope_condition'];
275
-                continue;
276
-            }
277
-
278
-            if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$php_errormsg') {
279
-                continue;
280
-            }
281
-
282
-            $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true);
283
-
284
-            if ($nextNonEmpty !== false
285
-                && isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true
286
-            ) {
287
-                return false;
288
-            }
289
-        }
290
-
291
-        return true;
292
-    }
230
+		$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true);
231
+
232
+		// Is the variable being used as an array ?
233
+		if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_OPEN_SQUARE_BRACKET) {
234
+			// The PHP native variable is a string, so this is probably not it
235
+			// (except for array access to string, but why would you in this case ?).
236
+			return false;
237
+		}
238
+
239
+		// Is this a variable assignment ?
240
+		if ($nextNonEmpty !== false
241
+			&& isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true
242
+		) {
243
+			return false;
244
+		}
245
+
246
+		// Is this a function param shadowing the PHP native one ?
247
+		if ($function !== false) {
248
+			$parameters = PHPCSHelper::getMethodParameters($phpcsFile, $function);
249
+			if (\is_array($parameters) === true && empty($parameters) === false) {
250
+				foreach ($parameters as $param) {
251
+					if ($param['name'] === '$php_errormsg') {
252
+						return false;
253
+					}
254
+				}
255
+			}
256
+		}
257
+
258
+		$skipPast = array(
259
+			'T_CLASS'      => true,
260
+			'T_ANON_CLASS' => true,
261
+			'T_INTERFACE'  => true,
262
+			'T_TRAIT'      => true,
263
+			'T_FUNCTION'   => true,
264
+			'T_CLOSURE'    => true,
265
+		);
266
+
267
+		// Walk back and see if there is an assignment to the variable within the same scope.
268
+		for ($i = ($stackPtr - 1); $i >= $scopeStart; $i--) {
269
+			if ($tokens[$i]['code'] === \T_CLOSE_CURLY_BRACKET
270
+				&& isset($tokens[$i]['scope_condition'])
271
+				&& isset($skipPast[$tokens[$tokens[$i]['scope_condition']]['type']])
272
+			) {
273
+				// Skip past functions, classes etc.
274
+				$i = $tokens[$i]['scope_condition'];
275
+				continue;
276
+			}
277
+
278
+			if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$php_errormsg') {
279
+				continue;
280
+			}
281
+
282
+			$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true);
283
+
284
+			if ($nextNonEmpty !== false
285
+				&& isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true
286
+			) {
287
+				return false;
288
+			}
289
+		}
290
+
291
+		return true;
292
+	}
293 293
 }
Please login to merge, or discard this patch.
Sniffs/FunctionUse/ArgumentFunctionsReportCurrentValueSniff.php 1 patch
Indentation   +363 added lines, -363 removed lines patch added patch discarded remove patch
@@ -30,191 +30,191 @@  discard block
 block discarded – undo
30 30
 class ArgumentFunctionsReportCurrentValueSniff extends Sniff
31 31
 {
32 32
 
33
-    /**
34
-     * A list of functions that, when called, can behave differently in PHP 7
35
-     * when dealing with parameters of the function they're called in.
36
-     *
37
-     * @var array
38
-     */
39
-    protected $changedFunctions = array(
40
-        'func_get_arg'          => true,
41
-        'func_get_args'         => true,
42
-        'debug_backtrace'       => true,
43
-        'debug_print_backtrace' => true,
44
-    );
45
-
46
-    /**
47
-     * Tokens to look out for to allow us to skip past nested scoped structures.
48
-     *
49
-     * @var array
50
-     */
51
-    private $skipPastNested = array(
52
-        'T_CLASS'      => true,
53
-        'T_ANON_CLASS' => true,
54
-        'T_INTERFACE'  => true,
55
-        'T_TRAIT'      => true,
56
-        'T_FUNCTION'   => true,
57
-        'T_CLOSURE'    => true,
58
-    );
59
-
60
-    /**
61
-     * List of tokens which when they preceed a T_STRING *within a function* indicate
62
-     * this is not a call to a PHP native function.
63
-     *
64
-     * This list already takes into account that nested scoped structures are being
65
-     * skipped over, so doesn't check for those again.
66
-     * Similarly, as constants won't have parentheses, those don't need to be checked
67
-     * for either.
68
-     *
69
-     * @var array
70
-     */
71
-    private $noneFunctionCallIndicators = array(
72
-        \T_DOUBLE_COLON    => true,
73
-        \T_OBJECT_OPERATOR => true,
74
-    );
75
-
76
-    /**
77
-     * The tokens for variable incrementing/decrementing.
78
-     *
79
-     * @var array
80
-     */
81
-    private $plusPlusMinusMinus = array(
82
-        \T_DEC => true,
83
-        \T_INC => true,
84
-    );
85
-
86
-    /**
87
-     * Tokens to ignore when determining the start of a statement.
88
-     *
89
-     * @var array
90
-     */
91
-    private $ignoreForStartOfStatement = array(
92
-        \T_COMMA,
93
-        \T_DOUBLE_ARROW,
94
-        \T_OPEN_SQUARE_BRACKET,
95
-        \T_OPEN_PARENTHESIS,
96
-    );
97
-
98
-    /**
99
-     * Returns an array of tokens this test wants to listen for.
100
-     *
101
-     * @return array
102
-     */
103
-    public function register()
104
-    {
105
-        return array(
106
-            \T_FUNCTION,
107
-            \T_CLOSURE,
108
-        );
109
-    }
110
-
111
-    /**
112
-     * Processes this test, when one of its tokens is encountered.
113
-     *
114
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
115
-     * @param int                   $stackPtr  The position of the current token
116
-     *                                         in the stack passed in $tokens.
117
-     *
118
-     * @return void
119
-     */
120
-    public function process(File $phpcsFile, $stackPtr)
121
-    {
122
-        if ($this->supportsAbove('7.0') === false) {
123
-            return;
124
-        }
125
-
126
-        $tokens = $phpcsFile->getTokens();
127
-
128
-        if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) {
129
-            // Abstract function, interface function, live coding or parse error.
130
-            return;
131
-        }
132
-
133
-        $scopeOpener = $tokens[$stackPtr]['scope_opener'];
134
-        $scopeCloser = $tokens[$stackPtr]['scope_closer'];
135
-
136
-        // Does the function declaration have parameters ?
137
-        $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr);
138
-        if (empty($params)) {
139
-            // No named arguments found, so no risk of them being changed.
140
-            return;
141
-        }
142
-
143
-        $paramNames = array();
144
-        foreach ($params as $param) {
145
-            $paramNames[] = $param['name'];
146
-        }
147
-
148
-        for ($i = ($scopeOpener + 1); $i < $scopeCloser; $i++) {
149
-            if (isset($this->skipPastNested[$tokens[$i]['type']]) && isset($tokens[$i]['scope_closer'])) {
150
-                // Skip past nested structures.
151
-                $i = $tokens[$i]['scope_closer'];
152
-                continue;
153
-            }
154
-
155
-            if ($tokens[$i]['code'] !== \T_STRING) {
156
-                continue;
157
-            }
158
-
159
-            $foundFunctionName = strtolower($tokens[$i]['content']);
160
-
161
-            if (isset($this->changedFunctions[$foundFunctionName]) === false) {
162
-                // Not one of the target functions.
163
-                continue;
164
-            }
165
-
166
-            /*
33
+	/**
34
+	 * A list of functions that, when called, can behave differently in PHP 7
35
+	 * when dealing with parameters of the function they're called in.
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $changedFunctions = array(
40
+		'func_get_arg'          => true,
41
+		'func_get_args'         => true,
42
+		'debug_backtrace'       => true,
43
+		'debug_print_backtrace' => true,
44
+	);
45
+
46
+	/**
47
+	 * Tokens to look out for to allow us to skip past nested scoped structures.
48
+	 *
49
+	 * @var array
50
+	 */
51
+	private $skipPastNested = array(
52
+		'T_CLASS'      => true,
53
+		'T_ANON_CLASS' => true,
54
+		'T_INTERFACE'  => true,
55
+		'T_TRAIT'      => true,
56
+		'T_FUNCTION'   => true,
57
+		'T_CLOSURE'    => true,
58
+	);
59
+
60
+	/**
61
+	 * List of tokens which when they preceed a T_STRING *within a function* indicate
62
+	 * this is not a call to a PHP native function.
63
+	 *
64
+	 * This list already takes into account that nested scoped structures are being
65
+	 * skipped over, so doesn't check for those again.
66
+	 * Similarly, as constants won't have parentheses, those don't need to be checked
67
+	 * for either.
68
+	 *
69
+	 * @var array
70
+	 */
71
+	private $noneFunctionCallIndicators = array(
72
+		\T_DOUBLE_COLON    => true,
73
+		\T_OBJECT_OPERATOR => true,
74
+	);
75
+
76
+	/**
77
+	 * The tokens for variable incrementing/decrementing.
78
+	 *
79
+	 * @var array
80
+	 */
81
+	private $plusPlusMinusMinus = array(
82
+		\T_DEC => true,
83
+		\T_INC => true,
84
+	);
85
+
86
+	/**
87
+	 * Tokens to ignore when determining the start of a statement.
88
+	 *
89
+	 * @var array
90
+	 */
91
+	private $ignoreForStartOfStatement = array(
92
+		\T_COMMA,
93
+		\T_DOUBLE_ARROW,
94
+		\T_OPEN_SQUARE_BRACKET,
95
+		\T_OPEN_PARENTHESIS,
96
+	);
97
+
98
+	/**
99
+	 * Returns an array of tokens this test wants to listen for.
100
+	 *
101
+	 * @return array
102
+	 */
103
+	public function register()
104
+	{
105
+		return array(
106
+			\T_FUNCTION,
107
+			\T_CLOSURE,
108
+		);
109
+	}
110
+
111
+	/**
112
+	 * Processes this test, when one of its tokens is encountered.
113
+	 *
114
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
115
+	 * @param int                   $stackPtr  The position of the current token
116
+	 *                                         in the stack passed in $tokens.
117
+	 *
118
+	 * @return void
119
+	 */
120
+	public function process(File $phpcsFile, $stackPtr)
121
+	{
122
+		if ($this->supportsAbove('7.0') === false) {
123
+			return;
124
+		}
125
+
126
+		$tokens = $phpcsFile->getTokens();
127
+
128
+		if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) {
129
+			// Abstract function, interface function, live coding or parse error.
130
+			return;
131
+		}
132
+
133
+		$scopeOpener = $tokens[$stackPtr]['scope_opener'];
134
+		$scopeCloser = $tokens[$stackPtr]['scope_closer'];
135
+
136
+		// Does the function declaration have parameters ?
137
+		$params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr);
138
+		if (empty($params)) {
139
+			// No named arguments found, so no risk of them being changed.
140
+			return;
141
+		}
142
+
143
+		$paramNames = array();
144
+		foreach ($params as $param) {
145
+			$paramNames[] = $param['name'];
146
+		}
147
+
148
+		for ($i = ($scopeOpener + 1); $i < $scopeCloser; $i++) {
149
+			if (isset($this->skipPastNested[$tokens[$i]['type']]) && isset($tokens[$i]['scope_closer'])) {
150
+				// Skip past nested structures.
151
+				$i = $tokens[$i]['scope_closer'];
152
+				continue;
153
+			}
154
+
155
+			if ($tokens[$i]['code'] !== \T_STRING) {
156
+				continue;
157
+			}
158
+
159
+			$foundFunctionName = strtolower($tokens[$i]['content']);
160
+
161
+			if (isset($this->changedFunctions[$foundFunctionName]) === false) {
162
+				// Not one of the target functions.
163
+				continue;
164
+			}
165
+
166
+			/*
167 167
              * Ok, so is this really a function call to one of the PHP native functions ?
168 168
              */
169
-            $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true);
170
-            if ($next === false || $tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) {
171
-                // Live coding, parse error or not a function call.
172
-                continue;
173
-            }
174
-
175
-            $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true);
176
-            if ($prev !== false) {
177
-                if (isset($this->noneFunctionCallIndicators[$tokens[$prev]['code']])) {
178
-                    continue;
179
-                }
180
-
181
-                // Check for namespaced functions, ie: \foo\bar() not \bar().
182
-                if ($tokens[ $prev ]['code'] === \T_NS_SEPARATOR) {
183
-                    $pprev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true);
184
-                    if ($pprev !== false && $tokens[ $pprev ]['code'] === \T_STRING) {
185
-                        continue;
186
-                    }
187
-                }
188
-            }
189
-
190
-            /*
169
+			$next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true);
170
+			if ($next === false || $tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) {
171
+				// Live coding, parse error or not a function call.
172
+				continue;
173
+			}
174
+
175
+			$prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true);
176
+			if ($prev !== false) {
177
+				if (isset($this->noneFunctionCallIndicators[$tokens[$prev]['code']])) {
178
+					continue;
179
+				}
180
+
181
+				// Check for namespaced functions, ie: \foo\bar() not \bar().
182
+				if ($tokens[ $prev ]['code'] === \T_NS_SEPARATOR) {
183
+					$pprev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true);
184
+					if ($pprev !== false && $tokens[ $pprev ]['code'] === \T_STRING) {
185
+						continue;
186
+					}
187
+				}
188
+			}
189
+
190
+			/*
191 191
              * Address some special cases.
192 192
              */
193
-            if ($foundFunctionName !== 'func_get_args') {
194
-                $paramOne = $this->getFunctionCallParameter($phpcsFile, $i, 1);
195
-                if ($paramOne !== false) {
196
-                    switch ($foundFunctionName) {
197
-                        /*
193
+			if ($foundFunctionName !== 'func_get_args') {
194
+				$paramOne = $this->getFunctionCallParameter($phpcsFile, $i, 1);
195
+				if ($paramOne !== false) {
196
+					switch ($foundFunctionName) {
197
+						/*
198 198
                          * Check if `debug_(print_)backtrace()` is called with the
199 199
                          * `DEBUG_BACKTRACE_IGNORE_ARGS` option.
200 200
                          */
201
-                        case 'debug_backtrace':
202
-                        case 'debug_print_backtrace':
203
-                            $hasIgnoreArgs = $phpcsFile->findNext(
204
-                                \T_STRING,
205
-                                $paramOne['start'],
206
-                                ($paramOne['end'] + 1),
207
-                                false,
208
-                                'DEBUG_BACKTRACE_IGNORE_ARGS'
209
-                            );
210
-
211
-                            if ($hasIgnoreArgs !== false) {
212
-                                // Debug_backtrace() called with ignore args option.
213
-                                continue 2;
214
-                            }
215
-                            break;
216
-
217
-                        /*
201
+						case 'debug_backtrace':
202
+						case 'debug_print_backtrace':
203
+							$hasIgnoreArgs = $phpcsFile->findNext(
204
+								\T_STRING,
205
+								$paramOne['start'],
206
+								($paramOne['end'] + 1),
207
+								false,
208
+								'DEBUG_BACKTRACE_IGNORE_ARGS'
209
+							);
210
+
211
+							if ($hasIgnoreArgs !== false) {
212
+								// Debug_backtrace() called with ignore args option.
213
+								continue 2;
214
+							}
215
+							break;
216
+
217
+						/*
218 218
                          * Collect the necessary information to only throw a notice if the argument
219 219
                          * touched/changed is in line with the passed $arg_num.
220 220
                          *
@@ -224,21 +224,21 @@  discard block
 block discarded – undo
224 224
                          * {@internal Note: This does not take calculations into account!
225 225
                          *  Should be exceptionally rare and can - if needs be - be addressed at a later stage.}}
226 226
                          */
227
-                        case 'func_get_arg':
228
-                            $number = $phpcsFile->findNext(\T_LNUMBER, $paramOne['start'], ($paramOne['end'] + 1));
229
-                            if ($number !== false) {
230
-                                $argNumber = $tokens[$number]['content'];
231
-
232
-                                if (isset($paramNames[$argNumber]) === false) {
233
-                                    // Requesting a non-named additional parameter. Ignore.
234
-                                    continue 2;
235
-                                }
236
-                            }
237
-                            break;
238
-                    }
239
-                }
240
-            } else {
241
-                /*
227
+						case 'func_get_arg':
228
+							$number = $phpcsFile->findNext(\T_LNUMBER, $paramOne['start'], ($paramOne['end'] + 1));
229
+							if ($number !== false) {
230
+								$argNumber = $tokens[$number]['content'];
231
+
232
+								if (isset($paramNames[$argNumber]) === false) {
233
+									// Requesting a non-named additional parameter. Ignore.
234
+									continue 2;
235
+								}
236
+							}
237
+							break;
238
+					}
239
+				}
240
+			} else {
241
+				/*
242 242
                  * Check if the call to func_get_args() happens to be in an array_slice() or
243 243
                  * array_splice() with an $offset higher than the number of named parameters.
244 244
                  * In that case, we can ignore it.
@@ -246,33 +246,33 @@  discard block
 block discarded – undo
246 246
                  * {@internal Note: This does not take offset calculations into account!
247 247
                  *  Should be exceptionally rare and can - if needs be - be addressed at a later stage.}}
248 248
                  */
249
-                if ($prev !== false && $tokens[$prev]['code'] === \T_OPEN_PARENTHESIS) {
250
-
251
-                    $maybeFunctionCall = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true);
252
-                    if ($maybeFunctionCall !== false
253
-                        && $tokens[$maybeFunctionCall]['code'] === \T_STRING
254
-                        && ($tokens[$maybeFunctionCall]['content'] === 'array_slice'
255
-                        || $tokens[$maybeFunctionCall]['content'] === 'array_splice')
256
-                    ) {
257
-                        $parentFuncParamTwo = $this->getFunctionCallParameter($phpcsFile, $maybeFunctionCall, 2);
258
-                        $number             = $phpcsFile->findNext(
259
-                            \T_LNUMBER,
260
-                            $parentFuncParamTwo['start'],
261
-                            ($parentFuncParamTwo['end'] + 1)
262
-                        );
263
-
264
-                        if ($number !== false && isset($paramNames[$tokens[$number]['content']]) === false) {
265
-                            // Requesting non-named additional parameters. Ignore.
266
-                            continue ;
267
-                        }
268
-
269
-                        // Slice starts at a named argument, but we know which params are being accessed.
270
-                        $paramNamesSubset = \array_slice($paramNames, $tokens[$number]['content']);
271
-                    }
272
-                }
273
-            }
274
-
275
-            /*
249
+				if ($prev !== false && $tokens[$prev]['code'] === \T_OPEN_PARENTHESIS) {
250
+
251
+					$maybeFunctionCall = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true);
252
+					if ($maybeFunctionCall !== false
253
+						&& $tokens[$maybeFunctionCall]['code'] === \T_STRING
254
+						&& ($tokens[$maybeFunctionCall]['content'] === 'array_slice'
255
+						|| $tokens[$maybeFunctionCall]['content'] === 'array_splice')
256
+					) {
257
+						$parentFuncParamTwo = $this->getFunctionCallParameter($phpcsFile, $maybeFunctionCall, 2);
258
+						$number             = $phpcsFile->findNext(
259
+							\T_LNUMBER,
260
+							$parentFuncParamTwo['start'],
261
+							($parentFuncParamTwo['end'] + 1)
262
+						);
263
+
264
+						if ($number !== false && isset($paramNames[$tokens[$number]['content']]) === false) {
265
+							// Requesting non-named additional parameters. Ignore.
266
+							continue ;
267
+						}
268
+
269
+						// Slice starts at a named argument, but we know which params are being accessed.
270
+						$paramNamesSubset = \array_slice($paramNames, $tokens[$number]['content']);
271
+					}
272
+				}
273
+			}
274
+
275
+			/*
276 276
              * For debug_backtrace(), check if the result is being dereferenced and if so,
277 277
              * whether the `args` index is used.
278 278
              * I.e. whether `$index` in `debug_backtrace()[$stackFrame][$index]` is a string
@@ -280,160 +280,160 @@  discard block
 block discarded – undo
280 280
              *
281 281
              * Note: We already know that $next is the open parenthesis of the function call.
282 282
              */
283
-            if ($foundFunctionName === 'debug_backtrace' && isset($tokens[$next]['parenthesis_closer'])) {
284
-                $afterParenthesis = $phpcsFile->findNext(
285
-                    Tokens::$emptyTokens,
286
-                    ($tokens[$next]['parenthesis_closer'] + 1),
287
-                    null,
288
-                    true
289
-                );
290
-
291
-                if ($tokens[$afterParenthesis]['code'] === \T_OPEN_SQUARE_BRACKET
292
-                    && isset($tokens[$afterParenthesis]['bracket_closer'])
293
-                ) {
294
-                    $afterStackFrame = $phpcsFile->findNext(
295
-                        Tokens::$emptyTokens,
296
-                        ($tokens[$afterParenthesis]['bracket_closer'] + 1),
297
-                        null,
298
-                        true
299
-                    );
300
-
301
-                    if ($tokens[$afterStackFrame]['code'] === \T_OPEN_SQUARE_BRACKET
302
-                        && isset($tokens[$afterStackFrame]['bracket_closer'])
303
-                    ) {
304
-                        $arrayIndex = $phpcsFile->findNext(
305
-                            \T_CONSTANT_ENCAPSED_STRING,
306
-                            ($afterStackFrame + 1),
307
-                            $tokens[$afterStackFrame]['bracket_closer']
308
-                        );
309
-
310
-                        if ($arrayIndex !== false && $this->stripQuotes($tokens[$arrayIndex]['content']) !== 'args') {
311
-                            continue;
312
-                        }
313
-                    }
314
-                }
315
-            }
316
-
317
-            /*
283
+			if ($foundFunctionName === 'debug_backtrace' && isset($tokens[$next]['parenthesis_closer'])) {
284
+				$afterParenthesis = $phpcsFile->findNext(
285
+					Tokens::$emptyTokens,
286
+					($tokens[$next]['parenthesis_closer'] + 1),
287
+					null,
288
+					true
289
+				);
290
+
291
+				if ($tokens[$afterParenthesis]['code'] === \T_OPEN_SQUARE_BRACKET
292
+					&& isset($tokens[$afterParenthesis]['bracket_closer'])
293
+				) {
294
+					$afterStackFrame = $phpcsFile->findNext(
295
+						Tokens::$emptyTokens,
296
+						($tokens[$afterParenthesis]['bracket_closer'] + 1),
297
+						null,
298
+						true
299
+					);
300
+
301
+					if ($tokens[$afterStackFrame]['code'] === \T_OPEN_SQUARE_BRACKET
302
+						&& isset($tokens[$afterStackFrame]['bracket_closer'])
303
+					) {
304
+						$arrayIndex = $phpcsFile->findNext(
305
+							\T_CONSTANT_ENCAPSED_STRING,
306
+							($afterStackFrame + 1),
307
+							$tokens[$afterStackFrame]['bracket_closer']
308
+						);
309
+
310
+						if ($arrayIndex !== false && $this->stripQuotes($tokens[$arrayIndex]['content']) !== 'args') {
311
+							continue;
312
+						}
313
+					}
314
+				}
315
+			}
316
+
317
+			/*
318 318
              * Only check for variables before the start of the statement to
319 319
              * prevent false positives on the return value of the function call
320 320
              * being assigned to one of the parameters, i.e.:
321 321
              * `$param = func_get_args();`.
322 322
              */
323
-            $startOfStatement = PHPCSHelper::findStartOfStatement($phpcsFile, $i, $this->ignoreForStartOfStatement);
323
+			$startOfStatement = PHPCSHelper::findStartOfStatement($phpcsFile, $i, $this->ignoreForStartOfStatement);
324 324
 
325
-            /*
325
+			/*
326 326
              * Ok, so we've found one of the target functions in the right scope.
327 327
              * Now, let's check if any of the passed parameters were touched.
328 328
              */
329
-            $scanResult = 'clean';
330
-            for ($j = ($scopeOpener + 1); $j < $startOfStatement; $j++) {
331
-                if (isset($this->skipPastNested[$tokens[$j]['type']])
332
-                    && isset($tokens[$j]['scope_closer'])
333
-                ) {
334
-                    // Skip past nested structures.
335
-                    $j = $tokens[$j]['scope_closer'];
336
-                    continue;
337
-                }
338
-
339
-                if ($tokens[$j]['code'] !== \T_VARIABLE) {
340
-                    continue;
341
-                }
342
-
343
-                if ($foundFunctionName === 'func_get_arg' && isset($argNumber)) {
344
-                    if (isset($paramNames[$argNumber])
345
-                        && $tokens[$j]['content'] !== $paramNames[$argNumber]
346
-                    ) {
347
-                        // Different param than the one requested by func_get_arg().
348
-                        continue;
349
-                    }
350
-                } elseif ($foundFunctionName === 'func_get_args' && isset($paramNamesSubset)) {
351
-                    if (\in_array($tokens[$j]['content'], $paramNamesSubset, true) === false) {
352
-                        // Different param than the ones requested by func_get_args().
353
-                        continue;
354
-                    }
355
-                } elseif (\in_array($tokens[$j]['content'], $paramNames, true) === false) {
356
-                    // Variable is not one of the function parameters.
357
-                    continue;
358
-                }
359
-
360
-                /*
329
+			$scanResult = 'clean';
330
+			for ($j = ($scopeOpener + 1); $j < $startOfStatement; $j++) {
331
+				if (isset($this->skipPastNested[$tokens[$j]['type']])
332
+					&& isset($tokens[$j]['scope_closer'])
333
+				) {
334
+					// Skip past nested structures.
335
+					$j = $tokens[$j]['scope_closer'];
336
+					continue;
337
+				}
338
+
339
+				if ($tokens[$j]['code'] !== \T_VARIABLE) {
340
+					continue;
341
+				}
342
+
343
+				if ($foundFunctionName === 'func_get_arg' && isset($argNumber)) {
344
+					if (isset($paramNames[$argNumber])
345
+						&& $tokens[$j]['content'] !== $paramNames[$argNumber]
346
+					) {
347
+						// Different param than the one requested by func_get_arg().
348
+						continue;
349
+					}
350
+				} elseif ($foundFunctionName === 'func_get_args' && isset($paramNamesSubset)) {
351
+					if (\in_array($tokens[$j]['content'], $paramNamesSubset, true) === false) {
352
+						// Different param than the ones requested by func_get_args().
353
+						continue;
354
+					}
355
+				} elseif (\in_array($tokens[$j]['content'], $paramNames, true) === false) {
356
+					// Variable is not one of the function parameters.
357
+					continue;
358
+				}
359
+
360
+				/*
361 361
                  * Ok, so we've found a variable which was passed as one of the parameters.
362 362
                  * Now, is this variable being changed, i.e. incremented, decremented or
363 363
                  * assigned something ?
364 364
                  */
365
-                $scanResult = 'warning';
366
-                if (isset($variableToken) === false) {
367
-                    $variableToken = $j;
368
-                }
369
-
370
-                $beforeVar = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($j - 1), null, true);
371
-                if ($beforeVar !== false && isset($this->plusPlusMinusMinus[$tokens[$beforeVar]['code']])) {
372
-                    // Variable is being (pre-)incremented/decremented.
373
-                    $scanResult    = 'error';
374
-                    $variableToken = $j;
375
-                    break;
376
-                }
377
-
378
-                $afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($j + 1), null, true);
379
-                if ($afterVar === false) {
380
-                    // Shouldn't be possible, but just in case.
381
-                    continue;
382
-                }
383
-
384
-                if (isset($this->plusPlusMinusMinus[$tokens[$afterVar]['code']])) {
385
-                    // Variable is being (post-)incremented/decremented.
386
-                    $scanResult    = 'error';
387
-                    $variableToken = $j;
388
-                    break;
389
-                }
390
-
391
-                if ($tokens[$afterVar]['code'] === \T_OPEN_SQUARE_BRACKET
392
-                    && isset($tokens[$afterVar]['bracket_closer'])
393
-                ) {
394
-                    // Skip past array access on the variable.
395
-                    while (($afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($tokens[$afterVar]['bracket_closer'] + 1), null, true)) !== false) {
396
-                        if ($tokens[$afterVar]['code'] !== \T_OPEN_SQUARE_BRACKET
397
-                            || isset($tokens[$afterVar]['bracket_closer']) === false
398
-                        ) {
399
-                            break;
400
-                        }
401
-                    }
402
-                }
403
-
404
-                if ($afterVar !== false
405
-                    && isset(Tokens::$assignmentTokens[$tokens[$afterVar]['code']])
406
-                ) {
407
-                    // Variable is being assigned something.
408
-                    $scanResult    = 'error';
409
-                    $variableToken = $j;
410
-                    break;
411
-                }
412
-            }
413
-
414
-            unset($argNumber, $paramNamesSubset);
415
-
416
-            if ($scanResult === 'clean') {
417
-                continue;
418
-            }
419
-
420
-            $error = 'Since PHP 7.0, functions inspecting arguments, like %1$s(), no longer report the original value as passed to a parameter, but will instead provide the current value. The parameter "%2$s" was %4$s on line %3$s.';
421
-            $data  = array(
422
-                $foundFunctionName,
423
-                $tokens[$variableToken]['content'],
424
-                $tokens[$variableToken]['line'],
425
-            );
426
-
427
-            if ($scanResult === 'error') {
428
-                $data[] = 'changed';
429
-                $phpcsFile->addError($error, $i, 'Changed', $data);
430
-
431
-            } elseif ($scanResult === 'warning') {
432
-                $data[] = 'used, and possibly changed (by reference),';
433
-                $phpcsFile->addWarning($error, $i, 'NeedsInspection', $data);
434
-            }
435
-
436
-            unset($variableToken);
437
-        }
438
-    }
365
+				$scanResult = 'warning';
366
+				if (isset($variableToken) === false) {
367
+					$variableToken = $j;
368
+				}
369
+
370
+				$beforeVar = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($j - 1), null, true);
371
+				if ($beforeVar !== false && isset($this->plusPlusMinusMinus[$tokens[$beforeVar]['code']])) {
372
+					// Variable is being (pre-)incremented/decremented.
373
+					$scanResult    = 'error';
374
+					$variableToken = $j;
375
+					break;
376
+				}
377
+
378
+				$afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($j + 1), null, true);
379
+				if ($afterVar === false) {
380
+					// Shouldn't be possible, but just in case.
381
+					continue;
382
+				}
383
+
384
+				if (isset($this->plusPlusMinusMinus[$tokens[$afterVar]['code']])) {
385
+					// Variable is being (post-)incremented/decremented.
386
+					$scanResult    = 'error';
387
+					$variableToken = $j;
388
+					break;
389
+				}
390
+
391
+				if ($tokens[$afterVar]['code'] === \T_OPEN_SQUARE_BRACKET
392
+					&& isset($tokens[$afterVar]['bracket_closer'])
393
+				) {
394
+					// Skip past array access on the variable.
395
+					while (($afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($tokens[$afterVar]['bracket_closer'] + 1), null, true)) !== false) {
396
+						if ($tokens[$afterVar]['code'] !== \T_OPEN_SQUARE_BRACKET
397
+							|| isset($tokens[$afterVar]['bracket_closer']) === false
398
+						) {
399
+							break;
400
+						}
401
+					}
402
+				}
403
+
404
+				if ($afterVar !== false
405
+					&& isset(Tokens::$assignmentTokens[$tokens[$afterVar]['code']])
406
+				) {
407
+					// Variable is being assigned something.
408
+					$scanResult    = 'error';
409
+					$variableToken = $j;
410
+					break;
411
+				}
412
+			}
413
+
414
+			unset($argNumber, $paramNamesSubset);
415
+
416
+			if ($scanResult === 'clean') {
417
+				continue;
418
+			}
419
+
420
+			$error = 'Since PHP 7.0, functions inspecting arguments, like %1$s(), no longer report the original value as passed to a parameter, but will instead provide the current value. The parameter "%2$s" was %4$s on line %3$s.';
421
+			$data  = array(
422
+				$foundFunctionName,
423
+				$tokens[$variableToken]['content'],
424
+				$tokens[$variableToken]['line'],
425
+			);
426
+
427
+			if ($scanResult === 'error') {
428
+				$data[] = 'changed';
429
+				$phpcsFile->addError($error, $i, 'Changed', $data);
430
+
431
+			} elseif ($scanResult === 'warning') {
432
+				$data[] = 'used, and possibly changed (by reference),';
433
+				$phpcsFile->addWarning($error, $i, 'NeedsInspection', $data);
434
+			}
435
+
436
+			unset($variableToken);
437
+		}
438
+	}
439 439
 }
Please login to merge, or discard this patch.
Sniffs/FunctionUse/RequiredToOptionalFunctionParametersSniff.php 1 patch
Indentation   +298 added lines, -298 removed lines patch added patch discarded remove patch
@@ -23,302 +23,302 @@
 block discarded – undo
23 23
 class RequiredToOptionalFunctionParametersSniff extends AbstractComplexVersionSniff
24 24
 {
25 25
 
26
-    /**
27
-     * A list of function parameters, which were required in older versions and became optional later on.
28
-     *
29
-     * The array lists : version number with true (required) and false (optional).
30
-     *
31
-     * The index is the location of the parameter in the parameter list, starting at 0 !
32
-     * If's sufficient to list the last version in which the parameter was still required.
33
-     *
34
-     * @var array
35
-     */
36
-    protected $functionParameters = array(
37
-        'array_merge' => array(
38
-            0 => array(
39
-                'name' => 'array(s) to merge',
40
-                '7.3'  => true,
41
-                '7.4'  => false,
42
-            ),
43
-        ),
44
-        'array_merge_recursive' => array(
45
-            0 => array(
46
-                'name' => 'array(s) to merge',
47
-                '7.3'  => true,
48
-                '7.4'  => false,
49
-            ),
50
-        ),
51
-        'array_push' => array(
52
-            1 => array(
53
-                'name' => 'element to push',
54
-                '7.2'  => true,
55
-                '7.3'  => false,
56
-            ),
57
-        ),
58
-        'array_unshift' => array(
59
-            1 => array(
60
-                'name' => 'element to prepend',
61
-                '7.2'  => true,
62
-                '7.3'  => false,
63
-            ),
64
-        ),
65
-        'bcscale' => array(
66
-            0 => array(
67
-                'name' => 'scale',
68
-                '7.2'  => true,
69
-                '7.3'  => false,
70
-            ),
71
-        ),
72
-        'ftp_fget' => array(
73
-            3 => array(
74
-                'name' => 'mode',
75
-                '7.2'  => true,
76
-                '7.3'  => false,
77
-            ),
78
-        ),
79
-        'ftp_fput' => array(
80
-            3 => array(
81
-                'name' => 'mode',
82
-                '7.2'  => true,
83
-                '7.3'  => false,
84
-            ),
85
-        ),
86
-        'ftp_get' => array(
87
-            3 => array(
88
-                'name' => 'mode',
89
-                '7.2'  => true,
90
-                '7.3'  => false,
91
-            ),
92
-        ),
93
-        'ftp_nb_fget' => array(
94
-            3 => array(
95
-                'name' => 'mode',
96
-                '7.2'  => true,
97
-                '7.3'  => false,
98
-            ),
99
-        ),
100
-        'ftp_nb_fput' => array(
101
-            3 => array(
102
-                'name' => 'mode',
103
-                '7.2'  => true,
104
-                '7.3'  => false,
105
-            ),
106
-        ),
107
-        'ftp_nb_get' => array(
108
-            3 => array(
109
-                'name' => 'mode',
110
-                '7.2'  => true,
111
-                '7.3'  => false,
112
-            ),
113
-        ),
114
-        'ftp_nb_put' => array(
115
-            3 => array(
116
-                'name' => 'mode',
117
-                '7.2'  => true,
118
-                '7.3'  => false,
119
-            ),
120
-        ),
121
-        'ftp_put' => array(
122
-            3 => array(
123
-                'name' => 'mode',
124
-                '7.2'  => true,
125
-                '7.3'  => false,
126
-            ),
127
-        ),
128
-        'getenv' => array(
129
-            0 => array(
130
-                'name' => 'varname',
131
-                '7.0'  => true,
132
-                '7.1'  => false,
133
-            ),
134
-        ),
135
-        'preg_match_all' => array(
136
-            2 => array(
137
-                'name' => 'matches',
138
-                '5.3'  => true,
139
-                '5.4'  => false,
140
-            ),
141
-        ),
142
-        'stream_socket_enable_crypto' => array(
143
-            2 => array(
144
-                'name' => 'crypto_type',
145
-                '5.5'  => true,
146
-                '5.6'  => false,
147
-            ),
148
-        ),
149
-    );
150
-
151
-
152
-    /**
153
-     * Returns an array of tokens this test wants to listen for.
154
-     *
155
-     * @return array
156
-     */
157
-    public function register()
158
-    {
159
-        // Handle case-insensitivity of function names.
160
-        $this->functionParameters = $this->arrayKeysToLowercase($this->functionParameters);
161
-
162
-        return array(\T_STRING);
163
-    }
164
-
165
-    /**
166
-     * Processes this test, when one of its tokens is encountered.
167
-     *
168
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
169
-     * @param int                   $stackPtr  The position of the current token in
170
-     *                                         the stack passed in $tokens.
171
-     *
172
-     * @return void
173
-     */
174
-    public function process(File $phpcsFile, $stackPtr)
175
-    {
176
-        $tokens = $phpcsFile->getTokens();
177
-
178
-        $ignore = array(
179
-            \T_DOUBLE_COLON    => true,
180
-            \T_OBJECT_OPERATOR => true,
181
-            \T_FUNCTION        => true,
182
-            \T_CONST           => true,
183
-        );
184
-
185
-        $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
186
-        if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
187
-            // Not a call to a PHP function.
188
-            return;
189
-        }
190
-
191
-        $function   = $tokens[$stackPtr]['content'];
192
-        $functionLc = strtolower($function);
193
-
194
-        if (isset($this->functionParameters[$functionLc]) === false) {
195
-            return;
196
-        }
197
-
198
-        $parameterCount  = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr);
199
-        $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true);
200
-
201
-        // If the parameter count returned > 0, we know there will be valid open parenthesis.
202
-        if ($parameterCount === 0 && $tokens[$openParenthesis]['code'] !== \T_OPEN_PARENTHESIS) {
203
-            return;
204
-        }
205
-
206
-        $parameterOffsetFound = $parameterCount - 1;
207
-
208
-        foreach ($this->functionParameters[$functionLc] as $offset => $parameterDetails) {
209
-            if ($offset > $parameterOffsetFound) {
210
-                $itemInfo = array(
211
-                    'name'   => $function,
212
-                    'nameLc' => $functionLc,
213
-                    'offset' => $offset,
214
-                );
215
-                $this->handleFeature($phpcsFile, $openParenthesis, $itemInfo);
216
-            }
217
-        }
218
-    }
219
-
220
-
221
-    /**
222
-     * Determine whether an error/warning should be thrown for an item based on collected information.
223
-     *
224
-     * @param array $errorInfo Detail information about an item.
225
-     *
226
-     * @return bool
227
-     */
228
-    protected function shouldThrowError(array $errorInfo)
229
-    {
230
-        return ($errorInfo['requiredVersion'] !== '');
231
-    }
232
-
233
-
234
-    /**
235
-     * Get the relevant sub-array for a specific item from a multi-dimensional array.
236
-     *
237
-     * @param array $itemInfo Base information about the item.
238
-     *
239
-     * @return array Version and other information about the item.
240
-     */
241
-    public function getItemArray(array $itemInfo)
242
-    {
243
-        return $this->functionParameters[$itemInfo['nameLc']][$itemInfo['offset']];
244
-    }
245
-
246
-
247
-    /**
248
-     * Get an array of the non-PHP-version array keys used in a sub-array.
249
-     *
250
-     * @return array
251
-     */
252
-    protected function getNonVersionArrayKeys()
253
-    {
254
-        return array('name');
255
-    }
256
-
257
-
258
-    /**
259
-     * Retrieve the relevant detail (version) information for use in an error message.
260
-     *
261
-     * @param array $itemArray Version and other information about the item.
262
-     * @param array $itemInfo  Base information about the item.
263
-     *
264
-     * @return array
265
-     */
266
-    public function getErrorInfo(array $itemArray, array $itemInfo)
267
-    {
268
-        $errorInfo = array(
269
-            'paramName'       => '',
270
-            'requiredVersion' => '',
271
-        );
272
-
273
-        $versionArray = $this->getVersionArray($itemArray);
274
-
275
-        if (empty($versionArray) === false) {
276
-            foreach ($versionArray as $version => $required) {
277
-                if ($required === true && $this->supportsBelow($version) === true) {
278
-                    $errorInfo['requiredVersion'] = $version;
279
-                }
280
-            }
281
-        }
282
-
283
-        $errorInfo['paramName'] = $itemArray['name'];
284
-
285
-        return $errorInfo;
286
-    }
287
-
288
-
289
-    /**
290
-     * Get the error message template for this sniff.
291
-     *
292
-     * @return string
293
-     */
294
-    protected function getErrorMsgTemplate()
295
-    {
296
-        return 'The "%s" parameter for function %s() is missing, but was required for PHP version %s and lower';
297
-    }
298
-
299
-
300
-    /**
301
-     * Generates the error or warning for this item.
302
-     *
303
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
304
-     * @param int                   $stackPtr  The position of the relevant token in
305
-     *                                         the stack.
306
-     * @param array                 $itemInfo  Base information about the item.
307
-     * @param array                 $errorInfo Array with detail (version) information
308
-     *                                         relevant to the item.
309
-     *
310
-     * @return void
311
-     */
312
-    public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo)
313
-    {
314
-        $error     = $this->getErrorMsgTemplate();
315
-        $errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']) . 'Missing';
316
-        $data      = array(
317
-            $errorInfo['paramName'],
318
-            $itemInfo['name'],
319
-            $errorInfo['requiredVersion'],
320
-        );
321
-
322
-        $phpcsFile->addError($error, $stackPtr, $errorCode, $data);
323
-    }
26
+	/**
27
+	 * A list of function parameters, which were required in older versions and became optional later on.
28
+	 *
29
+	 * The array lists : version number with true (required) and false (optional).
30
+	 *
31
+	 * The index is the location of the parameter in the parameter list, starting at 0 !
32
+	 * If's sufficient to list the last version in which the parameter was still required.
33
+	 *
34
+	 * @var array
35
+	 */
36
+	protected $functionParameters = array(
37
+		'array_merge' => array(
38
+			0 => array(
39
+				'name' => 'array(s) to merge',
40
+				'7.3'  => true,
41
+				'7.4'  => false,
42
+			),
43
+		),
44
+		'array_merge_recursive' => array(
45
+			0 => array(
46
+				'name' => 'array(s) to merge',
47
+				'7.3'  => true,
48
+				'7.4'  => false,
49
+			),
50
+		),
51
+		'array_push' => array(
52
+			1 => array(
53
+				'name' => 'element to push',
54
+				'7.2'  => true,
55
+				'7.3'  => false,
56
+			),
57
+		),
58
+		'array_unshift' => array(
59
+			1 => array(
60
+				'name' => 'element to prepend',
61
+				'7.2'  => true,
62
+				'7.3'  => false,
63
+			),
64
+		),
65
+		'bcscale' => array(
66
+			0 => array(
67
+				'name' => 'scale',
68
+				'7.2'  => true,
69
+				'7.3'  => false,
70
+			),
71
+		),
72
+		'ftp_fget' => array(
73
+			3 => array(
74
+				'name' => 'mode',
75
+				'7.2'  => true,
76
+				'7.3'  => false,
77
+			),
78
+		),
79
+		'ftp_fput' => array(
80
+			3 => array(
81
+				'name' => 'mode',
82
+				'7.2'  => true,
83
+				'7.3'  => false,
84
+			),
85
+		),
86
+		'ftp_get' => array(
87
+			3 => array(
88
+				'name' => 'mode',
89
+				'7.2'  => true,
90
+				'7.3'  => false,
91
+			),
92
+		),
93
+		'ftp_nb_fget' => array(
94
+			3 => array(
95
+				'name' => 'mode',
96
+				'7.2'  => true,
97
+				'7.3'  => false,
98
+			),
99
+		),
100
+		'ftp_nb_fput' => array(
101
+			3 => array(
102
+				'name' => 'mode',
103
+				'7.2'  => true,
104
+				'7.3'  => false,
105
+			),
106
+		),
107
+		'ftp_nb_get' => array(
108
+			3 => array(
109
+				'name' => 'mode',
110
+				'7.2'  => true,
111
+				'7.3'  => false,
112
+			),
113
+		),
114
+		'ftp_nb_put' => array(
115
+			3 => array(
116
+				'name' => 'mode',
117
+				'7.2'  => true,
118
+				'7.3'  => false,
119
+			),
120
+		),
121
+		'ftp_put' => array(
122
+			3 => array(
123
+				'name' => 'mode',
124
+				'7.2'  => true,
125
+				'7.3'  => false,
126
+			),
127
+		),
128
+		'getenv' => array(
129
+			0 => array(
130
+				'name' => 'varname',
131
+				'7.0'  => true,
132
+				'7.1'  => false,
133
+			),
134
+		),
135
+		'preg_match_all' => array(
136
+			2 => array(
137
+				'name' => 'matches',
138
+				'5.3'  => true,
139
+				'5.4'  => false,
140
+			),
141
+		),
142
+		'stream_socket_enable_crypto' => array(
143
+			2 => array(
144
+				'name' => 'crypto_type',
145
+				'5.5'  => true,
146
+				'5.6'  => false,
147
+			),
148
+		),
149
+	);
150
+
151
+
152
+	/**
153
+	 * Returns an array of tokens this test wants to listen for.
154
+	 *
155
+	 * @return array
156
+	 */
157
+	public function register()
158
+	{
159
+		// Handle case-insensitivity of function names.
160
+		$this->functionParameters = $this->arrayKeysToLowercase($this->functionParameters);
161
+
162
+		return array(\T_STRING);
163
+	}
164
+
165
+	/**
166
+	 * Processes this test, when one of its tokens is encountered.
167
+	 *
168
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
169
+	 * @param int                   $stackPtr  The position of the current token in
170
+	 *                                         the stack passed in $tokens.
171
+	 *
172
+	 * @return void
173
+	 */
174
+	public function process(File $phpcsFile, $stackPtr)
175
+	{
176
+		$tokens = $phpcsFile->getTokens();
177
+
178
+		$ignore = array(
179
+			\T_DOUBLE_COLON    => true,
180
+			\T_OBJECT_OPERATOR => true,
181
+			\T_FUNCTION        => true,
182
+			\T_CONST           => true,
183
+		);
184
+
185
+		$prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
186
+		if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
187
+			// Not a call to a PHP function.
188
+			return;
189
+		}
190
+
191
+		$function   = $tokens[$stackPtr]['content'];
192
+		$functionLc = strtolower($function);
193
+
194
+		if (isset($this->functionParameters[$functionLc]) === false) {
195
+			return;
196
+		}
197
+
198
+		$parameterCount  = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr);
199
+		$openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true);
200
+
201
+		// If the parameter count returned > 0, we know there will be valid open parenthesis.
202
+		if ($parameterCount === 0 && $tokens[$openParenthesis]['code'] !== \T_OPEN_PARENTHESIS) {
203
+			return;
204
+		}
205
+
206
+		$parameterOffsetFound = $parameterCount - 1;
207
+
208
+		foreach ($this->functionParameters[$functionLc] as $offset => $parameterDetails) {
209
+			if ($offset > $parameterOffsetFound) {
210
+				$itemInfo = array(
211
+					'name'   => $function,
212
+					'nameLc' => $functionLc,
213
+					'offset' => $offset,
214
+				);
215
+				$this->handleFeature($phpcsFile, $openParenthesis, $itemInfo);
216
+			}
217
+		}
218
+	}
219
+
220
+
221
+	/**
222
+	 * Determine whether an error/warning should be thrown for an item based on collected information.
223
+	 *
224
+	 * @param array $errorInfo Detail information about an item.
225
+	 *
226
+	 * @return bool
227
+	 */
228
+	protected function shouldThrowError(array $errorInfo)
229
+	{
230
+		return ($errorInfo['requiredVersion'] !== '');
231
+	}
232
+
233
+
234
+	/**
235
+	 * Get the relevant sub-array for a specific item from a multi-dimensional array.
236
+	 *
237
+	 * @param array $itemInfo Base information about the item.
238
+	 *
239
+	 * @return array Version and other information about the item.
240
+	 */
241
+	public function getItemArray(array $itemInfo)
242
+	{
243
+		return $this->functionParameters[$itemInfo['nameLc']][$itemInfo['offset']];
244
+	}
245
+
246
+
247
+	/**
248
+	 * Get an array of the non-PHP-version array keys used in a sub-array.
249
+	 *
250
+	 * @return array
251
+	 */
252
+	protected function getNonVersionArrayKeys()
253
+	{
254
+		return array('name');
255
+	}
256
+
257
+
258
+	/**
259
+	 * Retrieve the relevant detail (version) information for use in an error message.
260
+	 *
261
+	 * @param array $itemArray Version and other information about the item.
262
+	 * @param array $itemInfo  Base information about the item.
263
+	 *
264
+	 * @return array
265
+	 */
266
+	public function getErrorInfo(array $itemArray, array $itemInfo)
267
+	{
268
+		$errorInfo = array(
269
+			'paramName'       => '',
270
+			'requiredVersion' => '',
271
+		);
272
+
273
+		$versionArray = $this->getVersionArray($itemArray);
274
+
275
+		if (empty($versionArray) === false) {
276
+			foreach ($versionArray as $version => $required) {
277
+				if ($required === true && $this->supportsBelow($version) === true) {
278
+					$errorInfo['requiredVersion'] = $version;
279
+				}
280
+			}
281
+		}
282
+
283
+		$errorInfo['paramName'] = $itemArray['name'];
284
+
285
+		return $errorInfo;
286
+	}
287
+
288
+
289
+	/**
290
+	 * Get the error message template for this sniff.
291
+	 *
292
+	 * @return string
293
+	 */
294
+	protected function getErrorMsgTemplate()
295
+	{
296
+		return 'The "%s" parameter for function %s() is missing, but was required for PHP version %s and lower';
297
+	}
298
+
299
+
300
+	/**
301
+	 * Generates the error or warning for this item.
302
+	 *
303
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
304
+	 * @param int                   $stackPtr  The position of the relevant token in
305
+	 *                                         the stack.
306
+	 * @param array                 $itemInfo  Base information about the item.
307
+	 * @param array                 $errorInfo Array with detail (version) information
308
+	 *                                         relevant to the item.
309
+	 *
310
+	 * @return void
311
+	 */
312
+	public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo)
313
+	{
314
+		$error     = $this->getErrorMsgTemplate();
315
+		$errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']) . 'Missing';
316
+		$data      = array(
317
+			$errorInfo['paramName'],
318
+			$itemInfo['name'],
319
+			$errorInfo['requiredVersion'],
320
+		);
321
+
322
+		$phpcsFile->addError($error, $stackPtr, $errorCode, $data);
323
+	}
324 324
 }
Please login to merge, or discard this patch.
PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsUsageSniff.php 1 patch
Indentation   +116 added lines, -116 removed lines patch added patch discarded remove patch
@@ -35,130 +35,130 @@
 block discarded – undo
35 35
 class ArgumentFunctionsUsageSniff extends Sniff
36 36
 {
37 37
 
38
-    /**
39
-     * The target functions for this sniff.
40
-     *
41
-     * @var array
42
-     */
43
-    protected $targetFunctions = array(
44
-        'func_get_args' => true,
45
-        'func_get_arg'  => true,
46
-        'func_num_args' => true,
47
-    );
48
-
49
-
50
-    /**
51
-     * Returns an array of tokens this test wants to listen for.
52
-     *
53
-     * @return array
54
-     */
55
-    public function register()
56
-    {
57
-        return array(\T_STRING);
58
-    }
59
-
60
-
61
-    /**
62
-     * Processes this test, when one of its tokens is encountered.
63
-     *
64
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
65
-     * @param int                   $stackPtr  The position of the current token in the
66
-     *                                         stack passed in $tokens.
67
-     *
68
-     * @return void
69
-     */
70
-    public function process(File $phpcsFile, $stackPtr)
71
-    {
72
-        $tokens     = $phpcsFile->getTokens();
73
-        $functionLc = strtolower($tokens[$stackPtr]['content']);
74
-        if (isset($this->targetFunctions[$functionLc]) === false) {
75
-            return;
76
-        }
77
-
78
-        // Next non-empty token should be the open parenthesis.
79
-        $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true);
80
-        if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) {
81
-            return;
82
-        }
83
-
84
-        $ignore = array(
85
-            \T_DOUBLE_COLON    => true,
86
-            \T_OBJECT_OPERATOR => true,
87
-            \T_FUNCTION        => true,
88
-            \T_NEW             => true,
89
-        );
90
-
91
-        $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
92
-        if (isset($ignore[$tokens[$prevNonEmpty]['code']]) === true) {
93
-            // Not a call to a PHP function.
94
-            return;
95
-        } elseif ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR && $tokens[$prevNonEmpty - 1]['code'] === \T_STRING) {
96
-            // Namespaced function.
97
-            return;
98
-        }
99
-
100
-        $data = $tokens[$stackPtr]['content'];
101
-
102
-        /*
38
+	/**
39
+	 * The target functions for this sniff.
40
+	 *
41
+	 * @var array
42
+	 */
43
+	protected $targetFunctions = array(
44
+		'func_get_args' => true,
45
+		'func_get_arg'  => true,
46
+		'func_num_args' => true,
47
+	);
48
+
49
+
50
+	/**
51
+	 * Returns an array of tokens this test wants to listen for.
52
+	 *
53
+	 * @return array
54
+	 */
55
+	public function register()
56
+	{
57
+		return array(\T_STRING);
58
+	}
59
+
60
+
61
+	/**
62
+	 * Processes this test, when one of its tokens is encountered.
63
+	 *
64
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
65
+	 * @param int                   $stackPtr  The position of the current token in the
66
+	 *                                         stack passed in $tokens.
67
+	 *
68
+	 * @return void
69
+	 */
70
+	public function process(File $phpcsFile, $stackPtr)
71
+	{
72
+		$tokens     = $phpcsFile->getTokens();
73
+		$functionLc = strtolower($tokens[$stackPtr]['content']);
74
+		if (isset($this->targetFunctions[$functionLc]) === false) {
75
+			return;
76
+		}
77
+
78
+		// Next non-empty token should be the open parenthesis.
79
+		$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true);
80
+		if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) {
81
+			return;
82
+		}
83
+
84
+		$ignore = array(
85
+			\T_DOUBLE_COLON    => true,
86
+			\T_OBJECT_OPERATOR => true,
87
+			\T_FUNCTION        => true,
88
+			\T_NEW             => true,
89
+		);
90
+
91
+		$prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
92
+		if (isset($ignore[$tokens[$prevNonEmpty]['code']]) === true) {
93
+			// Not a call to a PHP function.
94
+			return;
95
+		} elseif ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR && $tokens[$prevNonEmpty - 1]['code'] === \T_STRING) {
96
+			// Namespaced function.
97
+			return;
98
+		}
99
+
100
+		$data = $tokens[$stackPtr]['content'];
101
+
102
+		/*
103 103
          * Check for usage of the functions in the global scope.
104 104
          *
105 105
          * As PHPCS can not determine whether a file is included from within a function in
106 106
          * another file, so always throw a warning/error.
107 107
          */
108
-        if ($phpcsFile->hasCondition($stackPtr, array(\T_FUNCTION, \T_CLOSURE)) === false) {
109
-            $isError = false;
110
-            $message = 'Use of %s() outside of a user-defined function is only supported if the file is included from within a user-defined function in another file prior to PHP 5.3.';
108
+		if ($phpcsFile->hasCondition($stackPtr, array(\T_FUNCTION, \T_CLOSURE)) === false) {
109
+			$isError = false;
110
+			$message = 'Use of %s() outside of a user-defined function is only supported if the file is included from within a user-defined function in another file prior to PHP 5.3.';
111 111
 
112
-            if ($this->supportsAbove('5.3') === true) {
113
-                $isError  = true;
114
-                $message .= ' As of PHP 5.3, it is no longer supported at all.';
115
-            }
112
+			if ($this->supportsAbove('5.3') === true) {
113
+				$isError  = true;
114
+				$message .= ' As of PHP 5.3, it is no longer supported at all.';
115
+			}
116 116
 
117
-            $this->addMessage($phpcsFile, $message, $stackPtr, $isError, 'OutsideFunctionScope', $data);
118
-        }
117
+			$this->addMessage($phpcsFile, $message, $stackPtr, $isError, 'OutsideFunctionScope', $data);
118
+		}
119 119
 
120
-        /*
120
+		/*
121 121
          * Check for usage of the functions as a parameter in a function call.
122 122
          */
123
-        if ($this->supportsBelow('5.2') === false) {
124
-            return;
125
-        }
126
-
127
-        if (isset($tokens[$stackPtr]['nested_parenthesis']) === false) {
128
-            return;
129
-        }
130
-
131
-        $throwError = false;
132
-
133
-        $closer = end($tokens[$stackPtr]['nested_parenthesis']);
134
-        if (isset($tokens[$closer]['parenthesis_owner'])
135
-            && $tokens[$tokens[$closer]['parenthesis_owner']]['type'] === 'T_CLOSURE'
136
-        ) {
137
-            $throwError = true;
138
-        } else {
139
-            $opener       = key($tokens[$stackPtr]['nested_parenthesis']);
140
-            $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true);
141
-            if ($tokens[$prevNonEmpty]['code'] !== \T_STRING) {
142
-                return;
143
-            }
144
-
145
-            $prevPrevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true);
146
-            if ($tokens[$prevPrevNonEmpty]['code'] === \T_FUNCTION) {
147
-                return;
148
-            }
149
-
150
-            $throwError = true;
151
-        }
152
-
153
-        if ($throwError === false) {
154
-            return;
155
-        }
156
-
157
-        $phpcsFile->addError(
158
-            '%s() could not be used in parameter lists prior to PHP 5.3.',
159
-            $stackPtr,
160
-            'InParameterList',
161
-            $data
162
-        );
163
-    }
123
+		if ($this->supportsBelow('5.2') === false) {
124
+			return;
125
+		}
126
+
127
+		if (isset($tokens[$stackPtr]['nested_parenthesis']) === false) {
128
+			return;
129
+		}
130
+
131
+		$throwError = false;
132
+
133
+		$closer = end($tokens[$stackPtr]['nested_parenthesis']);
134
+		if (isset($tokens[$closer]['parenthesis_owner'])
135
+			&& $tokens[$tokens[$closer]['parenthesis_owner']]['type'] === 'T_CLOSURE'
136
+		) {
137
+			$throwError = true;
138
+		} else {
139
+			$opener       = key($tokens[$stackPtr]['nested_parenthesis']);
140
+			$prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true);
141
+			if ($tokens[$prevNonEmpty]['code'] !== \T_STRING) {
142
+				return;
143
+			}
144
+
145
+			$prevPrevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true);
146
+			if ($tokens[$prevPrevNonEmpty]['code'] === \T_FUNCTION) {
147
+				return;
148
+			}
149
+
150
+			$throwError = true;
151
+		}
152
+
153
+		if ($throwError === false) {
154
+			return;
155
+		}
156
+
157
+		$phpcsFile->addError(
158
+			'%s() could not be used in parameter lists prior to PHP 5.3.',
159
+			$stackPtr,
160
+			'InParameterList',
161
+			$data
162
+		);
163
+	}
164 164
 }
Please login to merge, or discard this patch.
PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionsSniff.php 1 patch
Indentation   +995 added lines, -995 removed lines patch added patch discarded remove patch
@@ -21,1018 +21,1018 @@
 block discarded – undo
21 21
  */
22 22
 class RemovedFunctionsSniff extends AbstractRemovedFeatureSniff
23 23
 {
24
-    /**
25
-     * A list of deprecated and removed functions with their alternatives.
26
-     *
27
-     * The array lists : version number with false (deprecated) or true (removed) and an alternative function.
28
-     * If no alternative exists, it is NULL, i.e, the function should just not be used.
29
-     *
30
-     * @var array(string => array(string => bool|string|null))
31
-     */
32
-    protected $removedFunctions = array(
33
-        'php_check_syntax' => array(
34
-            '5.0.5' => true,
35
-            'alternative' => null,
36
-        ),
24
+	/**
25
+	 * A list of deprecated and removed functions with their alternatives.
26
+	 *
27
+	 * The array lists : version number with false (deprecated) or true (removed) and an alternative function.
28
+	 * If no alternative exists, it is NULL, i.e, the function should just not be used.
29
+	 *
30
+	 * @var array(string => array(string => bool|string|null))
31
+	 */
32
+	protected $removedFunctions = array(
33
+		'php_check_syntax' => array(
34
+			'5.0.5' => true,
35
+			'alternative' => null,
36
+		),
37 37
 
38
-        'pfpro_cleanup' => array(
39
-            '5.1' => true,
40
-            'alternative' => null,
41
-        ),
42
-        'pfpro_init' => array(
43
-            '5.1' => true,
44
-            'alternative' => null,
45
-        ),
46
-        'pfpro_process_raw' => array(
47
-            '5.1' => true,
48
-            'alternative' => null,
49
-        ),
50
-        'pfpro_process' => array(
51
-            '5.1' => true,
52
-            'alternative' => null,
53
-        ),
54
-        'pfpro_version' => array(
55
-            '5.1' => true,
56
-            'alternative' => null,
57
-        ),
38
+		'pfpro_cleanup' => array(
39
+			'5.1' => true,
40
+			'alternative' => null,
41
+		),
42
+		'pfpro_init' => array(
43
+			'5.1' => true,
44
+			'alternative' => null,
45
+		),
46
+		'pfpro_process_raw' => array(
47
+			'5.1' => true,
48
+			'alternative' => null,
49
+		),
50
+		'pfpro_process' => array(
51
+			'5.1' => true,
52
+			'alternative' => null,
53
+		),
54
+		'pfpro_version' => array(
55
+			'5.1' => true,
56
+			'alternative' => null,
57
+		),
58 58
 
59
-        'call_user_method' => array(
60
-            '5.3' => false,
61
-            '7.0' => true,
62
-            'alternative' => 'call_user_func()',
63
-        ),
64
-        'call_user_method_array' => array(
65
-            '5.3' => false,
66
-            '7.0' => true,
67
-            'alternative' => 'call_user_func_array()',
68
-        ),
69
-        'define_syslog_variables' => array(
70
-            '5.3' => false,
71
-            '5.4' => true,
72
-            'alternative' => null,
73
-        ),
74
-        'dl' => array(
75
-            '5.3' => false,
76
-            'alternative' => null,
77
-        ),
78
-        'ereg' => array(
79
-            '5.3' => false,
80
-            '7.0' => true,
81
-            'alternative' => 'preg_match()',
82
-        ),
83
-        'ereg_replace' => array(
84
-            '5.3' => false,
85
-            '7.0' => true,
86
-            'alternative' => 'preg_replace()',
87
-        ),
88
-        'eregi' => array(
89
-            '5.3' => false,
90
-            '7.0' => true,
91
-            'alternative' => 'preg_match()',
92
-        ),
93
-        'eregi_replace' => array(
94
-            '5.3' => false,
95
-            '7.0' => true,
96
-            'alternative' => 'preg_replace()',
97
-        ),
98
-        'imagepsbbox' => array(
99
-            '7.0' => true,
100
-            'alternative' => null,
101
-        ),
102
-        'imagepsencodefont' => array(
103
-            '7.0' => true,
104
-            'alternative' => null,
105
-        ),
106
-        'imagepsextendfont' => array(
107
-            '7.0' => true,
108
-            'alternative' => null,
109
-        ),
110
-        'imagepsfreefont' => array(
111
-            '7.0' => true,
112
-            'alternative' => null,
113
-        ),
114
-        'imagepsloadfont' => array(
115
-            '7.0' => true,
116
-            'alternative' => null,
117
-        ),
118
-        'imagepsslantfont' => array(
119
-            '7.0' => true,
120
-            'alternative' => null,
121
-        ),
122
-        'imagepstext' => array(
123
-            '7.0' => true,
124
-            'alternative' => null,
125
-        ),
126
-        'import_request_variables' => array(
127
-            '5.3' => false,
128
-            '5.4' => true,
129
-            'alternative' => null,
130
-        ),
131
-        'ldap_sort' => array(
132
-            '7.0' => false,
133
-            'alternative' => null,
134
-        ),
135
-        'mcrypt_generic_end' => array(
136
-            '5.3' => false,
137
-            '7.0' => true,
138
-            'alternative' => 'mcrypt_generic_deinit()',
139
-        ),
140
-        'mysql_db_query' => array(
141
-            '5.3' => false,
142
-            '7.0' => true,
143
-            'alternative' => 'mysqli::select_db() and mysqli::query()',
144
-        ),
145
-        'mysql_escape_string' => array(
146
-            '5.3' => false,
147
-            '7.0' => true,
148
-            'alternative' => 'mysqli::real_escape_string()',
149
-        ),
150
-        'mysql_list_dbs' => array(
151
-            '5.4' => false,
152
-            '7.0' => true,
153
-            'alternative' => null,
154
-        ),
155
-        'mysqli_bind_param' => array(
156
-            '5.3' => false,
157
-            '5.4' => true,
158
-            'alternative' => 'mysqli_stmt::bind_param()',
159
-        ),
160
-        'mysqli_bind_result' => array(
161
-            '5.3' => false,
162
-            '5.4' => true,
163
-            'alternative' => 'mysqli_stmt::bind_result()',
164
-        ),
165
-        'mysqli_client_encoding' => array(
166
-            '5.3' => false,
167
-            '5.4' => true,
168
-            'alternative' => 'mysqli::character_set_name()',
169
-        ),
170
-        'mysqli_fetch' => array(
171
-            '5.3' => false,
172
-            '5.4' => true,
173
-            'alternative' => 'mysqli_stmt::fetch()',
174
-        ),
175
-        'mysqli_param_count' => array(
176
-            '5.3' => false,
177
-            '5.4' => true,
178
-            'alternative' => 'mysqli_stmt_param_count()',
179
-        ),
180
-        'mysqli_get_metadata' => array(
181
-            '5.3' => false,
182
-            '5.4' => true,
183
-            'alternative' => 'mysqli_stmt::result_metadata()',
184
-        ),
185
-        'mysqli_send_long_data' => array(
186
-            '5.3' => false,
187
-            '5.4' => true,
188
-            'alternative' => 'mysqli_stmt::send_long_data()',
189
-        ),
190
-        'magic_quotes_runtime' => array(
191
-            '5.3' => false,
192
-            '7.0' => true,
193
-            'alternative' => null,
194
-        ),
195
-        'session_register' => array(
196
-            '5.3' => false,
197
-            '5.4' => true,
198
-            'alternative' => '$_SESSION',
199
-        ),
200
-        'session_unregister' => array(
201
-            '5.3' => false,
202
-            '5.4' => true,
203
-            'alternative' => '$_SESSION',
204
-        ),
205
-        'session_is_registered' => array(
206
-            '5.3' => false,
207
-            '5.4' => true,
208
-            'alternative' => '$_SESSION',
209
-        ),
210
-        'set_magic_quotes_runtime' => array(
211
-            '5.3' => false,
212
-            '7.0' => true,
213
-            'alternative' => null,
214
-        ),
215
-        'set_socket_blocking' => array(
216
-            '5.3' => false,
217
-            '7.0' => true,
218
-            'alternative' => 'stream_set_blocking()',
219
-        ),
220
-        'split' => array(
221
-            '5.3' => false,
222
-            '7.0' => true,
223
-            'alternative' => 'preg_split()',
224
-        ),
225
-        'spliti' => array(
226
-            '5.3' => false,
227
-            '7.0' => true,
228
-            'alternative' => 'preg_split()',
229
-        ),
230
-        'sql_regcase' => array(
231
-            '5.3' => false,
232
-            '7.0' => true,
233
-            'alternative' => null,
234
-        ),
235
-        'php_logo_guid' => array(
236
-            '5.5' => true,
237
-            'alternative' => null,
238
-        ),
239
-        'php_egg_logo_guid' => array(
240
-            '5.5' => true,
241
-            'alternative' => null,
242
-        ),
243
-        'php_real_logo_guid' => array(
244
-            '5.5' => true,
245
-            'alternative' => null,
246
-        ),
247
-        'zend_logo_guid' => array(
248
-            '5.5' => true,
249
-            'alternative' => null,
250
-        ),
251
-        'datefmt_set_timezone_id' => array(
252
-            '5.5' => false,
253
-            '7.0' => true,
254
-            'alternative' => 'IntlDateFormatter::setTimeZone()',
255
-        ),
256
-        'mcrypt_ecb' => array(
257
-            '5.5' => false,
258
-            '7.0' => true,
259
-            'alternative' => null,
260
-        ),
261
-        'mcrypt_cbc' => array(
262
-            '5.5' => false,
263
-            '7.0' => true,
264
-            'alternative' => null,
265
-        ),
266
-        'mcrypt_cfb' => array(
267
-            '5.5' => false,
268
-            '7.0' => true,
269
-            'alternative' => null,
270
-        ),
271
-        'mcrypt_ofb' => array(
272
-            '5.5' => false,
273
-            '7.0' => true,
274
-            'alternative' => null,
275
-        ),
276
-        'ocibindbyname' => array(
277
-            '5.4' => false,
278
-            'alternative' => 'oci_bind_by_name()',
279
-        ),
280
-        'ocicancel' => array(
281
-            '5.4' => false,
282
-            'alternative' => 'oci_cancel()',
283
-        ),
284
-        'ocicloselob' => array(
285
-            '5.4' => false,
286
-            'alternative' => 'OCI-Lob::close()',
287
-        ),
288
-        'ocicollappend' => array(
289
-            '5.4' => false,
290
-            'alternative' => 'OCI-Collection::append()',
291
-        ),
292
-        'ocicollassign' => array(
293
-            '5.4' => false,
294
-            'alternative' => 'OCI-Collection::assign()',
295
-        ),
296
-        'ocicollassignelem' => array(
297
-            '5.4' => false,
298
-            'alternative' => 'OCI-Collection::assignElem()',
299
-        ),
300
-        'ocicollgetelem' => array(
301
-            '5.4' => false,
302
-            'alternative' => 'OCI-Collection::getElem()',
303
-        ),
304
-        'ocicollmax' => array(
305
-            '5.4' => false,
306
-            'alternative' => 'OCI-Collection::max()',
307
-        ),
308
-        'ocicollsize' => array(
309
-            '5.4' => false,
310
-            'alternative' => 'OCI-Collection::size()',
311
-        ),
312
-        'ocicolltrim' => array(
313
-            '5.4' => false,
314
-            'alternative' => 'OCI-Collection::trim()',
315
-        ),
316
-        'ocicolumnisnull' => array(
317
-            '5.4' => false,
318
-            'alternative' => 'oci_field_is_null()',
319
-        ),
320
-        'ocicolumnname' => array(
321
-            '5.4' => false,
322
-            'alternative' => 'oci_field_name()',
323
-        ),
324
-        'ocicolumnprecision' => array(
325
-            '5.4' => false,
326
-            'alternative' => 'oci_field_precision()',
327
-        ),
328
-        'ocicolumnscale' => array(
329
-            '5.4' => false,
330
-            'alternative' => 'oci_field_scale()',
331
-        ),
332
-        'ocicolumnsize' => array(
333
-            '5.4' => false,
334
-            'alternative' => 'oci_field_size()',
335
-        ),
336
-        'ocicolumntype' => array(
337
-            '5.4' => false,
338
-            'alternative' => 'oci_field_type()',
339
-        ),
340
-        'ocicolumntyperaw' => array(
341
-            '5.4' => false,
342
-            'alternative' => 'oci_field_type_raw()',
343
-        ),
344
-        'ocicommit' => array(
345
-            '5.4' => false,
346
-            'alternative' => 'oci_commit()',
347
-        ),
348
-        'ocidefinebyname' => array(
349
-            '5.4' => false,
350
-            'alternative' => 'oci_define_by_name()',
351
-        ),
352
-        'ocierror' => array(
353
-            '5.4' => false,
354
-            'alternative' => 'oci_error()',
355
-        ),
356
-        'ociexecute' => array(
357
-            '5.4' => false,
358
-            'alternative' => 'oci_execute()',
359
-        ),
360
-        'ocifetch' => array(
361
-            '5.4' => false,
362
-            'alternative' => 'oci_fetch()',
363
-        ),
364
-        'ocifetchinto' => array(
365
-            '5.4' => false,
366
-            'alternative' => null,
367
-        ),
368
-        'ocifetchstatement' => array(
369
-            '5.4' => false,
370
-            'alternative' => 'oci_fetch_all()',
371
-        ),
372
-        'ocifreecollection' => array(
373
-            '5.4' => false,
374
-            'alternative' => 'OCI-Collection::free()',
375
-        ),
376
-        'ocifreecursor' => array(
377
-            '5.4' => false,
378
-            'alternative' => 'oci_free_statement()',
379
-        ),
380
-        'ocifreedesc' => array(
381
-            '5.4' => false,
382
-            'alternative' => 'OCI-Lob::free()',
383
-        ),
384
-        'ocifreestatement' => array(
385
-            '5.4' => false,
386
-            'alternative' => 'oci_free_statement()',
387
-        ),
388
-        'ociinternaldebug' => array(
389
-            '5.4' => false,
390
-            'alternative' => 'oci_internal_debug()',
391
-        ),
392
-        'ociloadlob' => array(
393
-            '5.4' => false,
394
-            'alternative' => 'OCI-Lob::load()',
395
-        ),
396
-        'ocilogoff' => array(
397
-            '5.4' => false,
398
-            'alternative' => 'oci_close()',
399
-        ),
400
-        'ocilogon' => array(
401
-            '5.4' => false,
402
-            'alternative' => 'oci_connect()',
403
-        ),
404
-        'ocinewcollection' => array(
405
-            '5.4' => false,
406
-            'alternative' => 'oci_new_collection()',
407
-        ),
408
-        'ocinewcursor' => array(
409
-            '5.4' => false,
410
-            'alternative' => 'oci_new_cursor()',
411
-        ),
412
-        'ocinewdescriptor' => array(
413
-            '5.4' => false,
414
-            'alternative' => 'oci_new_descriptor()',
415
-        ),
416
-        'ocinlogon' => array(
417
-            '5.4' => false,
418
-            'alternative' => 'oci_new_connect()',
419
-        ),
420
-        'ocinumcols' => array(
421
-            '5.4' => false,
422
-            'alternative' => 'oci_num_fields()',
423
-        ),
424
-        'ociparse' => array(
425
-            '5.4' => false,
426
-            'alternative' => 'oci_parse()',
427
-        ),
428
-        'ociplogon' => array(
429
-            '5.4' => false,
430
-            'alternative' => 'oci_pconnect()',
431
-        ),
432
-        'ociresult' => array(
433
-            '5.4' => false,
434
-            'alternative' => 'oci_result()',
435
-        ),
436
-        'ocirollback' => array(
437
-            '5.4' => false,
438
-            'alternative' => 'oci_rollback()',
439
-        ),
440
-        'ocirowcount' => array(
441
-            '5.4' => false,
442
-            'alternative' => 'oci_num_rows()',
443
-        ),
444
-        'ocisavelob' => array(
445
-            '5.4' => false,
446
-            'alternative' => 'OCI-Lob::save()',
447
-        ),
448
-        'ocisavelobfile' => array(
449
-            '5.4' => false,
450
-            'alternative' => 'OCI-Lob::import()',
451
-        ),
452
-        'ociserverversion' => array(
453
-            '5.4' => false,
454
-            'alternative' => 'oci_server_version()',
455
-        ),
456
-        'ocisetprefetch' => array(
457
-            '5.4' => false,
458
-            'alternative' => 'oci_set_prefetch()',
459
-        ),
460
-        'ocistatementtype' => array(
461
-            '5.4' => false,
462
-            'alternative' => 'oci_statement_type()',
463
-        ),
464
-        'ociwritelobtofile' => array(
465
-            '5.4' => false,
466
-            'alternative' => 'OCI-Lob::export()',
467
-        ),
468
-        'ociwritetemporarylob' => array(
469
-            '5.4' => false,
470
-            'alternative' => 'OCI-Lob::writeTemporary()',
471
-        ),
472
-        'mysqli_get_cache_stats' => array(
473
-            '5.4' => true,
474
-            'alternative' => null,
475
-        ),
59
+		'call_user_method' => array(
60
+			'5.3' => false,
61
+			'7.0' => true,
62
+			'alternative' => 'call_user_func()',
63
+		),
64
+		'call_user_method_array' => array(
65
+			'5.3' => false,
66
+			'7.0' => true,
67
+			'alternative' => 'call_user_func_array()',
68
+		),
69
+		'define_syslog_variables' => array(
70
+			'5.3' => false,
71
+			'5.4' => true,
72
+			'alternative' => null,
73
+		),
74
+		'dl' => array(
75
+			'5.3' => false,
76
+			'alternative' => null,
77
+		),
78
+		'ereg' => array(
79
+			'5.3' => false,
80
+			'7.0' => true,
81
+			'alternative' => 'preg_match()',
82
+		),
83
+		'ereg_replace' => array(
84
+			'5.3' => false,
85
+			'7.0' => true,
86
+			'alternative' => 'preg_replace()',
87
+		),
88
+		'eregi' => array(
89
+			'5.3' => false,
90
+			'7.0' => true,
91
+			'alternative' => 'preg_match()',
92
+		),
93
+		'eregi_replace' => array(
94
+			'5.3' => false,
95
+			'7.0' => true,
96
+			'alternative' => 'preg_replace()',
97
+		),
98
+		'imagepsbbox' => array(
99
+			'7.0' => true,
100
+			'alternative' => null,
101
+		),
102
+		'imagepsencodefont' => array(
103
+			'7.0' => true,
104
+			'alternative' => null,
105
+		),
106
+		'imagepsextendfont' => array(
107
+			'7.0' => true,
108
+			'alternative' => null,
109
+		),
110
+		'imagepsfreefont' => array(
111
+			'7.0' => true,
112
+			'alternative' => null,
113
+		),
114
+		'imagepsloadfont' => array(
115
+			'7.0' => true,
116
+			'alternative' => null,
117
+		),
118
+		'imagepsslantfont' => array(
119
+			'7.0' => true,
120
+			'alternative' => null,
121
+		),
122
+		'imagepstext' => array(
123
+			'7.0' => true,
124
+			'alternative' => null,
125
+		),
126
+		'import_request_variables' => array(
127
+			'5.3' => false,
128
+			'5.4' => true,
129
+			'alternative' => null,
130
+		),
131
+		'ldap_sort' => array(
132
+			'7.0' => false,
133
+			'alternative' => null,
134
+		),
135
+		'mcrypt_generic_end' => array(
136
+			'5.3' => false,
137
+			'7.0' => true,
138
+			'alternative' => 'mcrypt_generic_deinit()',
139
+		),
140
+		'mysql_db_query' => array(
141
+			'5.3' => false,
142
+			'7.0' => true,
143
+			'alternative' => 'mysqli::select_db() and mysqli::query()',
144
+		),
145
+		'mysql_escape_string' => array(
146
+			'5.3' => false,
147
+			'7.0' => true,
148
+			'alternative' => 'mysqli::real_escape_string()',
149
+		),
150
+		'mysql_list_dbs' => array(
151
+			'5.4' => false,
152
+			'7.0' => true,
153
+			'alternative' => null,
154
+		),
155
+		'mysqli_bind_param' => array(
156
+			'5.3' => false,
157
+			'5.4' => true,
158
+			'alternative' => 'mysqli_stmt::bind_param()',
159
+		),
160
+		'mysqli_bind_result' => array(
161
+			'5.3' => false,
162
+			'5.4' => true,
163
+			'alternative' => 'mysqli_stmt::bind_result()',
164
+		),
165
+		'mysqli_client_encoding' => array(
166
+			'5.3' => false,
167
+			'5.4' => true,
168
+			'alternative' => 'mysqli::character_set_name()',
169
+		),
170
+		'mysqli_fetch' => array(
171
+			'5.3' => false,
172
+			'5.4' => true,
173
+			'alternative' => 'mysqli_stmt::fetch()',
174
+		),
175
+		'mysqli_param_count' => array(
176
+			'5.3' => false,
177
+			'5.4' => true,
178
+			'alternative' => 'mysqli_stmt_param_count()',
179
+		),
180
+		'mysqli_get_metadata' => array(
181
+			'5.3' => false,
182
+			'5.4' => true,
183
+			'alternative' => 'mysqli_stmt::result_metadata()',
184
+		),
185
+		'mysqli_send_long_data' => array(
186
+			'5.3' => false,
187
+			'5.4' => true,
188
+			'alternative' => 'mysqli_stmt::send_long_data()',
189
+		),
190
+		'magic_quotes_runtime' => array(
191
+			'5.3' => false,
192
+			'7.0' => true,
193
+			'alternative' => null,
194
+		),
195
+		'session_register' => array(
196
+			'5.3' => false,
197
+			'5.4' => true,
198
+			'alternative' => '$_SESSION',
199
+		),
200
+		'session_unregister' => array(
201
+			'5.3' => false,
202
+			'5.4' => true,
203
+			'alternative' => '$_SESSION',
204
+		),
205
+		'session_is_registered' => array(
206
+			'5.3' => false,
207
+			'5.4' => true,
208
+			'alternative' => '$_SESSION',
209
+		),
210
+		'set_magic_quotes_runtime' => array(
211
+			'5.3' => false,
212
+			'7.0' => true,
213
+			'alternative' => null,
214
+		),
215
+		'set_socket_blocking' => array(
216
+			'5.3' => false,
217
+			'7.0' => true,
218
+			'alternative' => 'stream_set_blocking()',
219
+		),
220
+		'split' => array(
221
+			'5.3' => false,
222
+			'7.0' => true,
223
+			'alternative' => 'preg_split()',
224
+		),
225
+		'spliti' => array(
226
+			'5.3' => false,
227
+			'7.0' => true,
228
+			'alternative' => 'preg_split()',
229
+		),
230
+		'sql_regcase' => array(
231
+			'5.3' => false,
232
+			'7.0' => true,
233
+			'alternative' => null,
234
+		),
235
+		'php_logo_guid' => array(
236
+			'5.5' => true,
237
+			'alternative' => null,
238
+		),
239
+		'php_egg_logo_guid' => array(
240
+			'5.5' => true,
241
+			'alternative' => null,
242
+		),
243
+		'php_real_logo_guid' => array(
244
+			'5.5' => true,
245
+			'alternative' => null,
246
+		),
247
+		'zend_logo_guid' => array(
248
+			'5.5' => true,
249
+			'alternative' => null,
250
+		),
251
+		'datefmt_set_timezone_id' => array(
252
+			'5.5' => false,
253
+			'7.0' => true,
254
+			'alternative' => 'IntlDateFormatter::setTimeZone()',
255
+		),
256
+		'mcrypt_ecb' => array(
257
+			'5.5' => false,
258
+			'7.0' => true,
259
+			'alternative' => null,
260
+		),
261
+		'mcrypt_cbc' => array(
262
+			'5.5' => false,
263
+			'7.0' => true,
264
+			'alternative' => null,
265
+		),
266
+		'mcrypt_cfb' => array(
267
+			'5.5' => false,
268
+			'7.0' => true,
269
+			'alternative' => null,
270
+		),
271
+		'mcrypt_ofb' => array(
272
+			'5.5' => false,
273
+			'7.0' => true,
274
+			'alternative' => null,
275
+		),
276
+		'ocibindbyname' => array(
277
+			'5.4' => false,
278
+			'alternative' => 'oci_bind_by_name()',
279
+		),
280
+		'ocicancel' => array(
281
+			'5.4' => false,
282
+			'alternative' => 'oci_cancel()',
283
+		),
284
+		'ocicloselob' => array(
285
+			'5.4' => false,
286
+			'alternative' => 'OCI-Lob::close()',
287
+		),
288
+		'ocicollappend' => array(
289
+			'5.4' => false,
290
+			'alternative' => 'OCI-Collection::append()',
291
+		),
292
+		'ocicollassign' => array(
293
+			'5.4' => false,
294
+			'alternative' => 'OCI-Collection::assign()',
295
+		),
296
+		'ocicollassignelem' => array(
297
+			'5.4' => false,
298
+			'alternative' => 'OCI-Collection::assignElem()',
299
+		),
300
+		'ocicollgetelem' => array(
301
+			'5.4' => false,
302
+			'alternative' => 'OCI-Collection::getElem()',
303
+		),
304
+		'ocicollmax' => array(
305
+			'5.4' => false,
306
+			'alternative' => 'OCI-Collection::max()',
307
+		),
308
+		'ocicollsize' => array(
309
+			'5.4' => false,
310
+			'alternative' => 'OCI-Collection::size()',
311
+		),
312
+		'ocicolltrim' => array(
313
+			'5.4' => false,
314
+			'alternative' => 'OCI-Collection::trim()',
315
+		),
316
+		'ocicolumnisnull' => array(
317
+			'5.4' => false,
318
+			'alternative' => 'oci_field_is_null()',
319
+		),
320
+		'ocicolumnname' => array(
321
+			'5.4' => false,
322
+			'alternative' => 'oci_field_name()',
323
+		),
324
+		'ocicolumnprecision' => array(
325
+			'5.4' => false,
326
+			'alternative' => 'oci_field_precision()',
327
+		),
328
+		'ocicolumnscale' => array(
329
+			'5.4' => false,
330
+			'alternative' => 'oci_field_scale()',
331
+		),
332
+		'ocicolumnsize' => array(
333
+			'5.4' => false,
334
+			'alternative' => 'oci_field_size()',
335
+		),
336
+		'ocicolumntype' => array(
337
+			'5.4' => false,
338
+			'alternative' => 'oci_field_type()',
339
+		),
340
+		'ocicolumntyperaw' => array(
341
+			'5.4' => false,
342
+			'alternative' => 'oci_field_type_raw()',
343
+		),
344
+		'ocicommit' => array(
345
+			'5.4' => false,
346
+			'alternative' => 'oci_commit()',
347
+		),
348
+		'ocidefinebyname' => array(
349
+			'5.4' => false,
350
+			'alternative' => 'oci_define_by_name()',
351
+		),
352
+		'ocierror' => array(
353
+			'5.4' => false,
354
+			'alternative' => 'oci_error()',
355
+		),
356
+		'ociexecute' => array(
357
+			'5.4' => false,
358
+			'alternative' => 'oci_execute()',
359
+		),
360
+		'ocifetch' => array(
361
+			'5.4' => false,
362
+			'alternative' => 'oci_fetch()',
363
+		),
364
+		'ocifetchinto' => array(
365
+			'5.4' => false,
366
+			'alternative' => null,
367
+		),
368
+		'ocifetchstatement' => array(
369
+			'5.4' => false,
370
+			'alternative' => 'oci_fetch_all()',
371
+		),
372
+		'ocifreecollection' => array(
373
+			'5.4' => false,
374
+			'alternative' => 'OCI-Collection::free()',
375
+		),
376
+		'ocifreecursor' => array(
377
+			'5.4' => false,
378
+			'alternative' => 'oci_free_statement()',
379
+		),
380
+		'ocifreedesc' => array(
381
+			'5.4' => false,
382
+			'alternative' => 'OCI-Lob::free()',
383
+		),
384
+		'ocifreestatement' => array(
385
+			'5.4' => false,
386
+			'alternative' => 'oci_free_statement()',
387
+		),
388
+		'ociinternaldebug' => array(
389
+			'5.4' => false,
390
+			'alternative' => 'oci_internal_debug()',
391
+		),
392
+		'ociloadlob' => array(
393
+			'5.4' => false,
394
+			'alternative' => 'OCI-Lob::load()',
395
+		),
396
+		'ocilogoff' => array(
397
+			'5.4' => false,
398
+			'alternative' => 'oci_close()',
399
+		),
400
+		'ocilogon' => array(
401
+			'5.4' => false,
402
+			'alternative' => 'oci_connect()',
403
+		),
404
+		'ocinewcollection' => array(
405
+			'5.4' => false,
406
+			'alternative' => 'oci_new_collection()',
407
+		),
408
+		'ocinewcursor' => array(
409
+			'5.4' => false,
410
+			'alternative' => 'oci_new_cursor()',
411
+		),
412
+		'ocinewdescriptor' => array(
413
+			'5.4' => false,
414
+			'alternative' => 'oci_new_descriptor()',
415
+		),
416
+		'ocinlogon' => array(
417
+			'5.4' => false,
418
+			'alternative' => 'oci_new_connect()',
419
+		),
420
+		'ocinumcols' => array(
421
+			'5.4' => false,
422
+			'alternative' => 'oci_num_fields()',
423
+		),
424
+		'ociparse' => array(
425
+			'5.4' => false,
426
+			'alternative' => 'oci_parse()',
427
+		),
428
+		'ociplogon' => array(
429
+			'5.4' => false,
430
+			'alternative' => 'oci_pconnect()',
431
+		),
432
+		'ociresult' => array(
433
+			'5.4' => false,
434
+			'alternative' => 'oci_result()',
435
+		),
436
+		'ocirollback' => array(
437
+			'5.4' => false,
438
+			'alternative' => 'oci_rollback()',
439
+		),
440
+		'ocirowcount' => array(
441
+			'5.4' => false,
442
+			'alternative' => 'oci_num_rows()',
443
+		),
444
+		'ocisavelob' => array(
445
+			'5.4' => false,
446
+			'alternative' => 'OCI-Lob::save()',
447
+		),
448
+		'ocisavelobfile' => array(
449
+			'5.4' => false,
450
+			'alternative' => 'OCI-Lob::import()',
451
+		),
452
+		'ociserverversion' => array(
453
+			'5.4' => false,
454
+			'alternative' => 'oci_server_version()',
455
+		),
456
+		'ocisetprefetch' => array(
457
+			'5.4' => false,
458
+			'alternative' => 'oci_set_prefetch()',
459
+		),
460
+		'ocistatementtype' => array(
461
+			'5.4' => false,
462
+			'alternative' => 'oci_statement_type()',
463
+		),
464
+		'ociwritelobtofile' => array(
465
+			'5.4' => false,
466
+			'alternative' => 'OCI-Lob::export()',
467
+		),
468
+		'ociwritetemporarylob' => array(
469
+			'5.4' => false,
470
+			'alternative' => 'OCI-Lob::writeTemporary()',
471
+		),
472
+		'mysqli_get_cache_stats' => array(
473
+			'5.4' => true,
474
+			'alternative' => null,
475
+		),
476 476
 
477
-        'mcrypt_create_iv' => array(
478
-            '7.1' => false,
479
-            '7.2' => true,
480
-            'alternative' => 'random_bytes() or OpenSSL',
481
-        ),
482
-        'mcrypt_decrypt' => array(
483
-            '7.1' => false,
484
-            '7.2' => true,
485
-            'alternative' => 'OpenSSL',
486
-        ),
487
-        'mcrypt_enc_get_algorithms_name' => array(
488
-            '7.1' => false,
489
-            '7.2' => true,
490
-            'alternative' => 'OpenSSL',
491
-        ),
492
-        'mcrypt_enc_get_block_size' => array(
493
-            '7.1' => false,
494
-            '7.2' => true,
495
-            'alternative' => 'OpenSSL',
496
-        ),
497
-        'mcrypt_enc_get_iv_size' => array(
498
-            '7.1' => false,
499
-            '7.2' => true,
500
-            'alternative' => 'OpenSSL',
501
-        ),
502
-        'mcrypt_enc_get_key_size' => array(
503
-            '7.1' => false,
504
-            '7.2' => true,
505
-            'alternative' => 'OpenSSL',
506
-        ),
507
-        'mcrypt_enc_get_modes_name' => array(
508
-            '7.1' => false,
509
-            '7.2' => true,
510
-            'alternative' => 'OpenSSL',
511
-        ),
512
-        'mcrypt_enc_get_supported_key_sizes' => array(
513
-            '7.1' => false,
514
-            '7.2' => true,
515
-            'alternative' => 'OpenSSL',
516
-        ),
517
-        'mcrypt_enc_is_block_algorithm_mode' => array(
518
-            '7.1' => false,
519
-            '7.2' => true,
520
-            'alternative' => 'OpenSSL',
521
-        ),
522
-        'mcrypt_enc_is_block_algorithm' => array(
523
-            '7.1' => false,
524
-            '7.2' => true,
525
-            'alternative' => 'OpenSSL',
526
-        ),
527
-        'mcrypt_enc_is_block_mode' => array(
528
-            '7.1' => false,
529
-            '7.2' => true,
530
-            'alternative' => 'OpenSSL',
531
-        ),
532
-        'mcrypt_enc_self_test' => array(
533
-            '7.1' => false,
534
-            '7.2' => true,
535
-            'alternative' => 'OpenSSL',
536
-        ),
537
-        'mcrypt_encrypt' => array(
538
-            '7.1' => false,
539
-            '7.2' => true,
540
-            'alternative' => 'OpenSSL',
541
-        ),
542
-        'mcrypt_generic_deinit' => array(
543
-            '7.1' => false,
544
-            '7.2' => true,
545
-            'alternative' => 'OpenSSL',
546
-        ),
547
-        'mcrypt_generic_init' => array(
548
-            '7.1' => false,
549
-            '7.2' => true,
550
-            'alternative' => 'OpenSSL',
551
-        ),
552
-        'mcrypt_generic' => array(
553
-            '7.1' => false,
554
-            '7.2' => true,
555
-            'alternative' => 'OpenSSL',
556
-        ),
557
-        'mcrypt_get_block_size' => array(
558
-            '7.1' => false,
559
-            '7.2' => true,
560
-            'alternative' => 'OpenSSL',
561
-        ),
562
-        'mcrypt_get_cipher_name' => array(
563
-            '7.1' => false,
564
-            '7.2' => true,
565
-            'alternative' => 'OpenSSL',
566
-        ),
567
-        'mcrypt_get_iv_size' => array(
568
-            '7.1' => false,
569
-            '7.2' => true,
570
-            'alternative' => 'OpenSSL',
571
-        ),
572
-        'mcrypt_get_key_size' => array(
573
-            '7.1' => false,
574
-            '7.2' => true,
575
-            'alternative' => 'OpenSSL',
576
-        ),
577
-        'mcrypt_list_algorithms' => array(
578
-            '7.1' => false,
579
-            '7.2' => true,
580
-            'alternative' => 'OpenSSL',
581
-        ),
582
-        'mcrypt_list_modes' => array(
583
-            '7.1' => false,
584
-            '7.2' => true,
585
-            'alternative' => 'OpenSSL',
586
-        ),
587
-        'mcrypt_module_close' => array(
588
-            '7.1' => false,
589
-            '7.2' => true,
590
-            'alternative' => 'OpenSSL',
591
-        ),
592
-        'mcrypt_module_get_algo_block_size' => array(
593
-            '7.1' => false,
594
-            '7.2' => true,
595
-            'alternative' => 'OpenSSL',
596
-        ),
597
-        'mcrypt_module_get_algo_key_size' => array(
598
-            '7.1' => false,
599
-            '7.2' => true,
600
-            'alternative' => 'OpenSSL',
601
-        ),
602
-        'mcrypt_module_get_supported_key_sizes' => array(
603
-            '7.1' => false,
604
-            '7.2' => true,
605
-            'alternative' => 'OpenSSL',
606
-        ),
607
-        'mcrypt_module_is_block_algorithm_mode' => array(
608
-            '7.1' => false,
609
-            '7.2' => true,
610
-            'alternative' => 'OpenSSL',
611
-        ),
612
-        'mcrypt_module_is_block_algorithm' => array(
613
-            '7.1' => false,
614
-            '7.2' => true,
615
-            'alternative' => 'OpenSSL',
616
-        ),
617
-        'mcrypt_module_is_block_mode' => array(
618
-            '7.1' => false,
619
-            '7.2' => true,
620
-            'alternative' => 'OpenSSL',
621
-        ),
622
-        'mcrypt_module_open' => array(
623
-            '7.1' => false,
624
-            '7.2' => true,
625
-            'alternative' => 'OpenSSL',
626
-        ),
627
-        'mcrypt_module_self_test' => array(
628
-            '7.1' => false,
629
-            '7.2' => true,
630
-            'alternative' => 'OpenSSL',
631
-        ),
632
-        'mdecrypt_generic' => array(
633
-            '7.1' => false,
634
-            '7.2' => true,
635
-            'alternative' => 'OpenSSL',
636
-        ),
637
-        'jpeg2wbmp' => array(
638
-            '7.2' => false,
639
-            'alternative' => 'imagecreatefromjpeg() and imagewbmp()',
640
-        ),
641
-        'png2wbmp' => array(
642
-            '7.2' => false,
643
-            'alternative' => 'imagecreatefrompng() or imagewbmp()',
644
-        ),
645
-        'create_function' => array(
646
-            '7.2' => false,
647
-            'alternative' => 'an anonymous function',
648
-        ),
649
-        'each' => array(
650
-            '7.2' => false,
651
-            'alternative' => 'a foreach loop',
652
-        ),
653
-        'gmp_random' => array(
654
-            '7.2' => false,
655
-            'alternative' => 'gmp_random_bits() or gmp_random_range()',
656
-        ),
657
-        'read_exif_data' => array(
658
-            '7.2' => false,
659
-            'alternative' => 'exif_read_data()',
660
-        ),
477
+		'mcrypt_create_iv' => array(
478
+			'7.1' => false,
479
+			'7.2' => true,
480
+			'alternative' => 'random_bytes() or OpenSSL',
481
+		),
482
+		'mcrypt_decrypt' => array(
483
+			'7.1' => false,
484
+			'7.2' => true,
485
+			'alternative' => 'OpenSSL',
486
+		),
487
+		'mcrypt_enc_get_algorithms_name' => array(
488
+			'7.1' => false,
489
+			'7.2' => true,
490
+			'alternative' => 'OpenSSL',
491
+		),
492
+		'mcrypt_enc_get_block_size' => array(
493
+			'7.1' => false,
494
+			'7.2' => true,
495
+			'alternative' => 'OpenSSL',
496
+		),
497
+		'mcrypt_enc_get_iv_size' => array(
498
+			'7.1' => false,
499
+			'7.2' => true,
500
+			'alternative' => 'OpenSSL',
501
+		),
502
+		'mcrypt_enc_get_key_size' => array(
503
+			'7.1' => false,
504
+			'7.2' => true,
505
+			'alternative' => 'OpenSSL',
506
+		),
507
+		'mcrypt_enc_get_modes_name' => array(
508
+			'7.1' => false,
509
+			'7.2' => true,
510
+			'alternative' => 'OpenSSL',
511
+		),
512
+		'mcrypt_enc_get_supported_key_sizes' => array(
513
+			'7.1' => false,
514
+			'7.2' => true,
515
+			'alternative' => 'OpenSSL',
516
+		),
517
+		'mcrypt_enc_is_block_algorithm_mode' => array(
518
+			'7.1' => false,
519
+			'7.2' => true,
520
+			'alternative' => 'OpenSSL',
521
+		),
522
+		'mcrypt_enc_is_block_algorithm' => array(
523
+			'7.1' => false,
524
+			'7.2' => true,
525
+			'alternative' => 'OpenSSL',
526
+		),
527
+		'mcrypt_enc_is_block_mode' => array(
528
+			'7.1' => false,
529
+			'7.2' => true,
530
+			'alternative' => 'OpenSSL',
531
+		),
532
+		'mcrypt_enc_self_test' => array(
533
+			'7.1' => false,
534
+			'7.2' => true,
535
+			'alternative' => 'OpenSSL',
536
+		),
537
+		'mcrypt_encrypt' => array(
538
+			'7.1' => false,
539
+			'7.2' => true,
540
+			'alternative' => 'OpenSSL',
541
+		),
542
+		'mcrypt_generic_deinit' => array(
543
+			'7.1' => false,
544
+			'7.2' => true,
545
+			'alternative' => 'OpenSSL',
546
+		),
547
+		'mcrypt_generic_init' => array(
548
+			'7.1' => false,
549
+			'7.2' => true,
550
+			'alternative' => 'OpenSSL',
551
+		),
552
+		'mcrypt_generic' => array(
553
+			'7.1' => false,
554
+			'7.2' => true,
555
+			'alternative' => 'OpenSSL',
556
+		),
557
+		'mcrypt_get_block_size' => array(
558
+			'7.1' => false,
559
+			'7.2' => true,
560
+			'alternative' => 'OpenSSL',
561
+		),
562
+		'mcrypt_get_cipher_name' => array(
563
+			'7.1' => false,
564
+			'7.2' => true,
565
+			'alternative' => 'OpenSSL',
566
+		),
567
+		'mcrypt_get_iv_size' => array(
568
+			'7.1' => false,
569
+			'7.2' => true,
570
+			'alternative' => 'OpenSSL',
571
+		),
572
+		'mcrypt_get_key_size' => array(
573
+			'7.1' => false,
574
+			'7.2' => true,
575
+			'alternative' => 'OpenSSL',
576
+		),
577
+		'mcrypt_list_algorithms' => array(
578
+			'7.1' => false,
579
+			'7.2' => true,
580
+			'alternative' => 'OpenSSL',
581
+		),
582
+		'mcrypt_list_modes' => array(
583
+			'7.1' => false,
584
+			'7.2' => true,
585
+			'alternative' => 'OpenSSL',
586
+		),
587
+		'mcrypt_module_close' => array(
588
+			'7.1' => false,
589
+			'7.2' => true,
590
+			'alternative' => 'OpenSSL',
591
+		),
592
+		'mcrypt_module_get_algo_block_size' => array(
593
+			'7.1' => false,
594
+			'7.2' => true,
595
+			'alternative' => 'OpenSSL',
596
+		),
597
+		'mcrypt_module_get_algo_key_size' => array(
598
+			'7.1' => false,
599
+			'7.2' => true,
600
+			'alternative' => 'OpenSSL',
601
+		),
602
+		'mcrypt_module_get_supported_key_sizes' => array(
603
+			'7.1' => false,
604
+			'7.2' => true,
605
+			'alternative' => 'OpenSSL',
606
+		),
607
+		'mcrypt_module_is_block_algorithm_mode' => array(
608
+			'7.1' => false,
609
+			'7.2' => true,
610
+			'alternative' => 'OpenSSL',
611
+		),
612
+		'mcrypt_module_is_block_algorithm' => array(
613
+			'7.1' => false,
614
+			'7.2' => true,
615
+			'alternative' => 'OpenSSL',
616
+		),
617
+		'mcrypt_module_is_block_mode' => array(
618
+			'7.1' => false,
619
+			'7.2' => true,
620
+			'alternative' => 'OpenSSL',
621
+		),
622
+		'mcrypt_module_open' => array(
623
+			'7.1' => false,
624
+			'7.2' => true,
625
+			'alternative' => 'OpenSSL',
626
+		),
627
+		'mcrypt_module_self_test' => array(
628
+			'7.1' => false,
629
+			'7.2' => true,
630
+			'alternative' => 'OpenSSL',
631
+		),
632
+		'mdecrypt_generic' => array(
633
+			'7.1' => false,
634
+			'7.2' => true,
635
+			'alternative' => 'OpenSSL',
636
+		),
637
+		'jpeg2wbmp' => array(
638
+			'7.2' => false,
639
+			'alternative' => 'imagecreatefromjpeg() and imagewbmp()',
640
+		),
641
+		'png2wbmp' => array(
642
+			'7.2' => false,
643
+			'alternative' => 'imagecreatefrompng() or imagewbmp()',
644
+		),
645
+		'create_function' => array(
646
+			'7.2' => false,
647
+			'alternative' => 'an anonymous function',
648
+		),
649
+		'each' => array(
650
+			'7.2' => false,
651
+			'alternative' => 'a foreach loop',
652
+		),
653
+		'gmp_random' => array(
654
+			'7.2' => false,
655
+			'alternative' => 'gmp_random_bits() or gmp_random_range()',
656
+		),
657
+		'read_exif_data' => array(
658
+			'7.2' => false,
659
+			'alternative' => 'exif_read_data()',
660
+		),
661 661
 
662
-        'image2wbmp' => array(
663
-            '7.3' => false,
664
-            'alternative' => 'imagewbmp()',
665
-        ),
666
-        'mbregex_encoding' => array(
667
-            '7.3' => false,
668
-            'alternative' => 'mb_regex_encoding()',
669
-        ),
670
-        'mbereg' => array(
671
-            '7.3' => false,
672
-            'alternative' => 'mb_ereg()',
673
-        ),
674
-        'mberegi' => array(
675
-            '7.3' => false,
676
-            'alternative' => 'mb_eregi()',
677
-        ),
678
-        'mbereg_replace' => array(
679
-            '7.3' => false,
680
-            'alternative' => 'mb_ereg_replace()',
681
-        ),
682
-        'mberegi_replace' => array(
683
-            '7.3' => false,
684
-            'alternative' => 'mb_eregi_replace()',
685
-        ),
686
-        'mbsplit' => array(
687
-            '7.3' => false,
688
-            'alternative' => 'mb_split()',
689
-        ),
690
-        'mbereg_match' => array(
691
-            '7.3' => false,
692
-            'alternative' => 'mb_ereg_match()',
693
-        ),
694
-        'mbereg_search' => array(
695
-            '7.3' => false,
696
-            'alternative' => 'mb_ereg_search()',
697
-        ),
698
-        'mbereg_search_pos' => array(
699
-            '7.3' => false,
700
-            'alternative' => 'mb_ereg_search_pos()',
701
-        ),
702
-        'mbereg_search_regs' => array(
703
-            '7.3' => false,
704
-            'alternative' => 'mb_ereg_search_regs()',
705
-        ),
706
-        'mbereg_search_init' => array(
707
-            '7.3' => false,
708
-            'alternative' => 'mb_ereg_search_init()',
709
-        ),
710
-        'mbereg_search_getregs' => array(
711
-            '7.3' => false,
712
-            'alternative' => 'mb_ereg_search_getregs()',
713
-        ),
714
-        'mbereg_search_getpos' => array(
715
-            '7.3' => false,
716
-            'alternative' => 'mb_ereg_search_getpos()',
717
-        ),
718
-        'mbereg_search_setpos' => array(
719
-            '7.3' => false,
720
-            'alternative' => 'mb_ereg_search_setpos()',
721
-        ),
722
-        'fgetss' => array(
723
-            '7.3' => false,
724
-            'alternative' => null,
725
-        ),
726
-        'gzgetss' => array(
727
-            '7.3' => false,
728
-            'alternative' => null,
729
-        ),
662
+		'image2wbmp' => array(
663
+			'7.3' => false,
664
+			'alternative' => 'imagewbmp()',
665
+		),
666
+		'mbregex_encoding' => array(
667
+			'7.3' => false,
668
+			'alternative' => 'mb_regex_encoding()',
669
+		),
670
+		'mbereg' => array(
671
+			'7.3' => false,
672
+			'alternative' => 'mb_ereg()',
673
+		),
674
+		'mberegi' => array(
675
+			'7.3' => false,
676
+			'alternative' => 'mb_eregi()',
677
+		),
678
+		'mbereg_replace' => array(
679
+			'7.3' => false,
680
+			'alternative' => 'mb_ereg_replace()',
681
+		),
682
+		'mberegi_replace' => array(
683
+			'7.3' => false,
684
+			'alternative' => 'mb_eregi_replace()',
685
+		),
686
+		'mbsplit' => array(
687
+			'7.3' => false,
688
+			'alternative' => 'mb_split()',
689
+		),
690
+		'mbereg_match' => array(
691
+			'7.3' => false,
692
+			'alternative' => 'mb_ereg_match()',
693
+		),
694
+		'mbereg_search' => array(
695
+			'7.3' => false,
696
+			'alternative' => 'mb_ereg_search()',
697
+		),
698
+		'mbereg_search_pos' => array(
699
+			'7.3' => false,
700
+			'alternative' => 'mb_ereg_search_pos()',
701
+		),
702
+		'mbereg_search_regs' => array(
703
+			'7.3' => false,
704
+			'alternative' => 'mb_ereg_search_regs()',
705
+		),
706
+		'mbereg_search_init' => array(
707
+			'7.3' => false,
708
+			'alternative' => 'mb_ereg_search_init()',
709
+		),
710
+		'mbereg_search_getregs' => array(
711
+			'7.3' => false,
712
+			'alternative' => 'mb_ereg_search_getregs()',
713
+		),
714
+		'mbereg_search_getpos' => array(
715
+			'7.3' => false,
716
+			'alternative' => 'mb_ereg_search_getpos()',
717
+		),
718
+		'mbereg_search_setpos' => array(
719
+			'7.3' => false,
720
+			'alternative' => 'mb_ereg_search_setpos()',
721
+		),
722
+		'fgetss' => array(
723
+			'7.3' => false,
724
+			'alternative' => null,
725
+		),
726
+		'gzgetss' => array(
727
+			'7.3' => false,
728
+			'alternative' => null,
729
+		),
730 730
 
731
-        'ibase_add_user' => array(
732
-            '7.4' => true,
733
-            'alternative' => null,
734
-        ),
735
-        'ibase_affected_rows' => array(
736
-            '7.4' => true,
737
-            'alternative' => null,
738
-        ),
739
-        'ibase_backup' => array(
740
-            '7.4' => true,
741
-            'alternative' => null,
742
-        ),
743
-        'ibase_blob_add' => array(
744
-            '7.4' => true,
745
-            'alternative' => null,
746
-        ),
747
-        'ibase_blob_cancel' => array(
748
-            '7.4' => true,
749
-            'alternative' => null,
750
-        ),
751
-        'ibase_blob_close' => array(
752
-            '7.4' => true,
753
-            'alternative' => null,
754
-        ),
755
-        'ibase_blob_create' => array(
756
-            '7.4' => true,
757
-            'alternative' => null,
758
-        ),
759
-        'ibase_blob_echo' => array(
760
-            '7.4' => true,
761
-            'alternative' => null,
762
-        ),
763
-        'ibase_blob_get' => array(
764
-            '7.4' => true,
765
-            'alternative' => null,
766
-        ),
767
-        'ibase_blob_import' => array(
768
-            '7.4' => true,
769
-            'alternative' => null,
770
-        ),
771
-        'ibase_blob_info' => array(
772
-            '7.4' => true,
773
-            'alternative' => null,
774
-        ),
775
-        'ibase_blob_open' => array(
776
-            '7.4' => true,
777
-            'alternative' => null,
778
-        ),
779
-        'ibase_close' => array(
780
-            '7.4' => true,
781
-            'alternative' => null,
782
-        ),
783
-        'ibase_commit_ret' => array(
784
-            '7.4' => true,
785
-            'alternative' => null,
786
-        ),
787
-        'ibase_commit' => array(
788
-            '7.4' => true,
789
-            'alternative' => null,
790
-        ),
791
-        'ibase_connect' => array(
792
-            '7.4' => true,
793
-            'alternative' => null,
794
-        ),
795
-        'ibase_db_info' => array(
796
-            '7.4' => true,
797
-            'alternative' => null,
798
-        ),
799
-        'ibase_delete_user' => array(
800
-            '7.4' => true,
801
-            'alternative' => null,
802
-        ),
803
-        'ibase_drop_db' => array(
804
-            '7.4' => true,
805
-            'alternative' => null,
806
-        ),
807
-        'ibase_errcode' => array(
808
-            '7.4' => true,
809
-            'alternative' => null,
810
-        ),
811
-        'ibase_errmsg' => array(
812
-            '7.4' => true,
813
-            'alternative' => null,
814
-        ),
815
-        'ibase_execute' => array(
816
-            '7.4' => true,
817
-            'alternative' => null,
818
-        ),
819
-        'ibase_fetch_assoc' => array(
820
-            '7.4' => true,
821
-            'alternative' => null,
822
-        ),
823
-        'ibase_fetch_object' => array(
824
-            '7.4' => true,
825
-            'alternative' => null,
826
-        ),
827
-        'ibase_fetch_row' => array(
828
-            '7.4' => true,
829
-            'alternative' => null,
830
-        ),
831
-        'ibase_field_info' => array(
832
-            '7.4' => true,
833
-            'alternative' => null,
834
-        ),
835
-        'ibase_free_event_handler' => array(
836
-            '7.4' => true,
837
-            'alternative' => null,
838
-        ),
839
-        'ibase_free_query' => array(
840
-            '7.4' => true,
841
-            'alternative' => null,
842
-        ),
843
-        'ibase_free_result' => array(
844
-            '7.4' => true,
845
-            'alternative' => null,
846
-        ),
847
-        'ibase_gen_id' => array(
848
-            '7.4' => true,
849
-            'alternative' => null,
850
-        ),
851
-        'ibase_maintain_db' => array(
852
-            '7.4' => true,
853
-            'alternative' => null,
854
-        ),
855
-        'ibase_modify_user' => array(
856
-            '7.4' => true,
857
-            'alternative' => null,
858
-        ),
859
-        'ibase_name_result' => array(
860
-            '7.4' => true,
861
-            'alternative' => null,
862
-        ),
863
-        'ibase_num_fields' => array(
864
-            '7.4' => true,
865
-            'alternative' => null,
866
-        ),
867
-        'ibase_num_params' => array(
868
-            '7.4' => true,
869
-            'alternative' => null,
870
-        ),
871
-        'ibase_param_info' => array(
872
-            '7.4' => true,
873
-            'alternative' => null,
874
-        ),
875
-        'ibase_pconnect' => array(
876
-            '7.4' => true,
877
-            'alternative' => null,
878
-        ),
879
-        'ibase_prepare' => array(
880
-            '7.4' => true,
881
-            'alternative' => null,
882
-        ),
883
-        'ibase_query' => array(
884
-            '7.4' => true,
885
-            'alternative' => null,
886
-        ),
887
-        'ibase_restore' => array(
888
-            '7.4' => true,
889
-            'alternative' => null,
890
-        ),
891
-        'ibase_rollback_ret' => array(
892
-            '7.4' => true,
893
-            'alternative' => null,
894
-        ),
895
-        'ibase_rollback' => array(
896
-            '7.4' => true,
897
-            'alternative' => null,
898
-        ),
899
-        'ibase_server_info' => array(
900
-            '7.4' => true,
901
-            'alternative' => null,
902
-        ),
903
-        'ibase_service_attach' => array(
904
-            '7.4' => true,
905
-            'alternative' => null,
906
-        ),
907
-        'ibase_service_detach' => array(
908
-            '7.4' => true,
909
-            'alternative' => null,
910
-        ),
911
-        'ibase_set_event_handler' => array(
912
-            '7.4' => true,
913
-            'alternative' => null,
914
-        ),
915
-        'ibase_trans' => array(
916
-            '7.4' => true,
917
-            'alternative' => null,
918
-        ),
919
-        'ibase_wait_event' => array(
920
-            '7.4' => true,
921
-            'alternative' => null,
922
-        ),
923
-        'ldap_control_paged_result_response' => array(
924
-            '7.4' => false,
925
-            'alternative' => 'ldap_search()',
926
-        ),
927
-        'ldap_control_paged_result' => array(
928
-            '7.4' => false,
929
-            'alternative' => 'ldap_search()',
930
-        ),
931
-        'wddx_add_vars' => array(
932
-            '7.4' => true,
933
-            'alternative' => null,
934
-        ),
935
-        'wddx_deserialize' => array(
936
-            '7.4' => true,
937
-            'alternative' => null,
938
-        ),
939
-        'wddx_packet_end' => array(
940
-            '7.4' => true,
941
-            'alternative' => null,
942
-        ),
943
-        'wddx_packet_start' => array(
944
-            '7.4' => true,
945
-            'alternative' => null,
946
-        ),
947
-        'wddx_serialize_value' => array(
948
-            '7.4' => true,
949
-            'alternative' => null,
950
-        ),
951
-        'wddx_serialize_vars' => array(
952
-            '7.4' => true,
953
-            'alternative' => null,
954
-        ),
955
-    );
731
+		'ibase_add_user' => array(
732
+			'7.4' => true,
733
+			'alternative' => null,
734
+		),
735
+		'ibase_affected_rows' => array(
736
+			'7.4' => true,
737
+			'alternative' => null,
738
+		),
739
+		'ibase_backup' => array(
740
+			'7.4' => true,
741
+			'alternative' => null,
742
+		),
743
+		'ibase_blob_add' => array(
744
+			'7.4' => true,
745
+			'alternative' => null,
746
+		),
747
+		'ibase_blob_cancel' => array(
748
+			'7.4' => true,
749
+			'alternative' => null,
750
+		),
751
+		'ibase_blob_close' => array(
752
+			'7.4' => true,
753
+			'alternative' => null,
754
+		),
755
+		'ibase_blob_create' => array(
756
+			'7.4' => true,
757
+			'alternative' => null,
758
+		),
759
+		'ibase_blob_echo' => array(
760
+			'7.4' => true,
761
+			'alternative' => null,
762
+		),
763
+		'ibase_blob_get' => array(
764
+			'7.4' => true,
765
+			'alternative' => null,
766
+		),
767
+		'ibase_blob_import' => array(
768
+			'7.4' => true,
769
+			'alternative' => null,
770
+		),
771
+		'ibase_blob_info' => array(
772
+			'7.4' => true,
773
+			'alternative' => null,
774
+		),
775
+		'ibase_blob_open' => array(
776
+			'7.4' => true,
777
+			'alternative' => null,
778
+		),
779
+		'ibase_close' => array(
780
+			'7.4' => true,
781
+			'alternative' => null,
782
+		),
783
+		'ibase_commit_ret' => array(
784
+			'7.4' => true,
785
+			'alternative' => null,
786
+		),
787
+		'ibase_commit' => array(
788
+			'7.4' => true,
789
+			'alternative' => null,
790
+		),
791
+		'ibase_connect' => array(
792
+			'7.4' => true,
793
+			'alternative' => null,
794
+		),
795
+		'ibase_db_info' => array(
796
+			'7.4' => true,
797
+			'alternative' => null,
798
+		),
799
+		'ibase_delete_user' => array(
800
+			'7.4' => true,
801
+			'alternative' => null,
802
+		),
803
+		'ibase_drop_db' => array(
804
+			'7.4' => true,
805
+			'alternative' => null,
806
+		),
807
+		'ibase_errcode' => array(
808
+			'7.4' => true,
809
+			'alternative' => null,
810
+		),
811
+		'ibase_errmsg' => array(
812
+			'7.4' => true,
813
+			'alternative' => null,
814
+		),
815
+		'ibase_execute' => array(
816
+			'7.4' => true,
817
+			'alternative' => null,
818
+		),
819
+		'ibase_fetch_assoc' => array(
820
+			'7.4' => true,
821
+			'alternative' => null,
822
+		),
823
+		'ibase_fetch_object' => array(
824
+			'7.4' => true,
825
+			'alternative' => null,
826
+		),
827
+		'ibase_fetch_row' => array(
828
+			'7.4' => true,
829
+			'alternative' => null,
830
+		),
831
+		'ibase_field_info' => array(
832
+			'7.4' => true,
833
+			'alternative' => null,
834
+		),
835
+		'ibase_free_event_handler' => array(
836
+			'7.4' => true,
837
+			'alternative' => null,
838
+		),
839
+		'ibase_free_query' => array(
840
+			'7.4' => true,
841
+			'alternative' => null,
842
+		),
843
+		'ibase_free_result' => array(
844
+			'7.4' => true,
845
+			'alternative' => null,
846
+		),
847
+		'ibase_gen_id' => array(
848
+			'7.4' => true,
849
+			'alternative' => null,
850
+		),
851
+		'ibase_maintain_db' => array(
852
+			'7.4' => true,
853
+			'alternative' => null,
854
+		),
855
+		'ibase_modify_user' => array(
856
+			'7.4' => true,
857
+			'alternative' => null,
858
+		),
859
+		'ibase_name_result' => array(
860
+			'7.4' => true,
861
+			'alternative' => null,
862
+		),
863
+		'ibase_num_fields' => array(
864
+			'7.4' => true,
865
+			'alternative' => null,
866
+		),
867
+		'ibase_num_params' => array(
868
+			'7.4' => true,
869
+			'alternative' => null,
870
+		),
871
+		'ibase_param_info' => array(
872
+			'7.4' => true,
873
+			'alternative' => null,
874
+		),
875
+		'ibase_pconnect' => array(
876
+			'7.4' => true,
877
+			'alternative' => null,
878
+		),
879
+		'ibase_prepare' => array(
880
+			'7.4' => true,
881
+			'alternative' => null,
882
+		),
883
+		'ibase_query' => array(
884
+			'7.4' => true,
885
+			'alternative' => null,
886
+		),
887
+		'ibase_restore' => array(
888
+			'7.4' => true,
889
+			'alternative' => null,
890
+		),
891
+		'ibase_rollback_ret' => array(
892
+			'7.4' => true,
893
+			'alternative' => null,
894
+		),
895
+		'ibase_rollback' => array(
896
+			'7.4' => true,
897
+			'alternative' => null,
898
+		),
899
+		'ibase_server_info' => array(
900
+			'7.4' => true,
901
+			'alternative' => null,
902
+		),
903
+		'ibase_service_attach' => array(
904
+			'7.4' => true,
905
+			'alternative' => null,
906
+		),
907
+		'ibase_service_detach' => array(
908
+			'7.4' => true,
909
+			'alternative' => null,
910
+		),
911
+		'ibase_set_event_handler' => array(
912
+			'7.4' => true,
913
+			'alternative' => null,
914
+		),
915
+		'ibase_trans' => array(
916
+			'7.4' => true,
917
+			'alternative' => null,
918
+		),
919
+		'ibase_wait_event' => array(
920
+			'7.4' => true,
921
+			'alternative' => null,
922
+		),
923
+		'ldap_control_paged_result_response' => array(
924
+			'7.4' => false,
925
+			'alternative' => 'ldap_search()',
926
+		),
927
+		'ldap_control_paged_result' => array(
928
+			'7.4' => false,
929
+			'alternative' => 'ldap_search()',
930
+		),
931
+		'wddx_add_vars' => array(
932
+			'7.4' => true,
933
+			'alternative' => null,
934
+		),
935
+		'wddx_deserialize' => array(
936
+			'7.4' => true,
937
+			'alternative' => null,
938
+		),
939
+		'wddx_packet_end' => array(
940
+			'7.4' => true,
941
+			'alternative' => null,
942
+		),
943
+		'wddx_packet_start' => array(
944
+			'7.4' => true,
945
+			'alternative' => null,
946
+		),
947
+		'wddx_serialize_value' => array(
948
+			'7.4' => true,
949
+			'alternative' => null,
950
+		),
951
+		'wddx_serialize_vars' => array(
952
+			'7.4' => true,
953
+			'alternative' => null,
954
+		),
955
+	);
956 956
 
957 957
 
958
-    /**
959
-     * Returns an array of tokens this test wants to listen for.
960
-     *
961
-     * @return array
962
-     */
963
-    public function register()
964
-    {
965
-        // Handle case-insensitivity of function names.
966
-        $this->removedFunctions = $this->arrayKeysToLowercase($this->removedFunctions);
958
+	/**
959
+	 * Returns an array of tokens this test wants to listen for.
960
+	 *
961
+	 * @return array
962
+	 */
963
+	public function register()
964
+	{
965
+		// Handle case-insensitivity of function names.
966
+		$this->removedFunctions = $this->arrayKeysToLowercase($this->removedFunctions);
967 967
 
968
-        return array(\T_STRING);
969
-    }
968
+		return array(\T_STRING);
969
+	}
970 970
 
971 971
 
972
-    /**
973
-     * Processes this test, when one of its tokens is encountered.
974
-     *
975
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
976
-     * @param int                   $stackPtr  The position of the current token in
977
-     *                                         the stack passed in $tokens.
978
-     *
979
-     * @return void
980
-     */
981
-    public function process(File $phpcsFile, $stackPtr)
982
-    {
983
-        $tokens = $phpcsFile->getTokens();
972
+	/**
973
+	 * Processes this test, when one of its tokens is encountered.
974
+	 *
975
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
976
+	 * @param int                   $stackPtr  The position of the current token in
977
+	 *                                         the stack passed in $tokens.
978
+	 *
979
+	 * @return void
980
+	 */
981
+	public function process(File $phpcsFile, $stackPtr)
982
+	{
983
+		$tokens = $phpcsFile->getTokens();
984 984
 
985
-        $ignore = array(
986
-            \T_DOUBLE_COLON    => true,
987
-            \T_OBJECT_OPERATOR => true,
988
-            \T_FUNCTION        => true,
989
-            \T_CLASS           => true,
990
-            \T_CONST           => true,
991
-            \T_USE             => true,
992
-            \T_NS_SEPARATOR    => true,
993
-        );
985
+		$ignore = array(
986
+			\T_DOUBLE_COLON    => true,
987
+			\T_OBJECT_OPERATOR => true,
988
+			\T_FUNCTION        => true,
989
+			\T_CLASS           => true,
990
+			\T_CONST           => true,
991
+			\T_USE             => true,
992
+			\T_NS_SEPARATOR    => true,
993
+		);
994 994
 
995
-        $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
996
-        if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
997
-            // Not a call to a PHP function.
998
-            return;
999
-        }
995
+		$prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
996
+		if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
997
+			// Not a call to a PHP function.
998
+			return;
999
+		}
1000 1000
 
1001
-        $function   = $tokens[$stackPtr]['content'];
1002
-        $functionLc = strtolower($function);
1001
+		$function   = $tokens[$stackPtr]['content'];
1002
+		$functionLc = strtolower($function);
1003 1003
 
1004
-        if (isset($this->removedFunctions[$functionLc]) === false) {
1005
-            return;
1006
-        }
1004
+		if (isset($this->removedFunctions[$functionLc]) === false) {
1005
+			return;
1006
+		}
1007 1007
 
1008
-        $itemInfo = array(
1009
-            'name'   => $function,
1010
-            'nameLc' => $functionLc,
1011
-        );
1012
-        $this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
1013
-    }
1008
+		$itemInfo = array(
1009
+			'name'   => $function,
1010
+			'nameLc' => $functionLc,
1011
+		);
1012
+		$this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
1013
+	}
1014 1014
 
1015 1015
 
1016
-    /**
1017
-     * Get the relevant sub-array for a specific item from a multi-dimensional array.
1018
-     *
1019
-     * @param array $itemInfo Base information about the item.
1020
-     *
1021
-     * @return array Version and other information about the item.
1022
-     */
1023
-    public function getItemArray(array $itemInfo)
1024
-    {
1025
-        return $this->removedFunctions[$itemInfo['nameLc']];
1026
-    }
1016
+	/**
1017
+	 * Get the relevant sub-array for a specific item from a multi-dimensional array.
1018
+	 *
1019
+	 * @param array $itemInfo Base information about the item.
1020
+	 *
1021
+	 * @return array Version and other information about the item.
1022
+	 */
1023
+	public function getItemArray(array $itemInfo)
1024
+	{
1025
+		return $this->removedFunctions[$itemInfo['nameLc']];
1026
+	}
1027 1027
 
1028 1028
 
1029
-    /**
1030
-     * Get the error message template for this sniff.
1031
-     *
1032
-     * @return string
1033
-     */
1034
-    protected function getErrorMsgTemplate()
1035
-    {
1036
-        return 'Function %s() is ';
1037
-    }
1029
+	/**
1030
+	 * Get the error message template for this sniff.
1031
+	 *
1032
+	 * @return string
1033
+	 */
1034
+	protected function getErrorMsgTemplate()
1035
+	{
1036
+		return 'Function %s() is ';
1037
+	}
1038 1038
 }
Please login to merge, or discard this patch.
PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionParametersSniff.php 1 patch
Indentation   +194 added lines, -194 removed lines patch added patch discarded remove patch
@@ -22,198 +22,198 @@
 block discarded – undo
22 22
  */
23 23
 class RemovedFunctionParametersSniff extends AbstractRemovedFeatureSniff
24 24
 {
25
-    /**
26
-     * A list of removed function parameters, which were present in older versions.
27
-     *
28
-     * The array lists : version number with false (deprecated) and true (removed).
29
-     * The index is the location of the parameter in the parameter list, starting at 0 !
30
-     * If's sufficient to list the first version where the function parameter was deprecated/removed.
31
-     *
32
-     * @var array
33
-     */
34
-    protected $removedFunctionParameters = array(
35
-        'define' => array(
36
-            2 => array(
37
-                'name' => 'case_insensitive',
38
-                '7.3'  => false, // Slated for removal in PHP 8.0.0.
39
-            ),
40
-        ),
41
-        'gmmktime' => array(
42
-            6 => array(
43
-                'name' => 'is_dst',
44
-                '5.1'  => false,
45
-                '7.0'  => true,
46
-            ),
47
-        ),
48
-        'ldap_first_attribute' => array(
49
-            2 => array(
50
-                'name'  => 'ber_identifier',
51
-                '5.2.4' => true,
52
-            ),
53
-        ),
54
-        'ldap_next_attribute' => array(
55
-            2 => array(
56
-                'name'  => 'ber_identifier',
57
-                '5.2.4' => true,
58
-            ),
59
-        ),
60
-        'mktime' => array(
61
-            6 => array(
62
-                'name' => 'is_dst',
63
-                '5.1'  => false,
64
-                '7.0'  => true,
65
-            ),
66
-        ),
67
-    );
68
-
69
-
70
-    /**
71
-     * Returns an array of tokens this test wants to listen for.
72
-     *
73
-     * @return array
74
-     */
75
-    public function register()
76
-    {
77
-        // Handle case-insensitivity of function names.
78
-        $this->removedFunctionParameters = $this->arrayKeysToLowercase($this->removedFunctionParameters);
79
-
80
-        return array(\T_STRING);
81
-    }
82
-
83
-    /**
84
-     * Processes this test, when one of its tokens is encountered.
85
-     *
86
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
87
-     * @param int                   $stackPtr  The position of the current token in
88
-     *                                         the stack passed in $tokens.
89
-     *
90
-     * @return void
91
-     */
92
-    public function process(File $phpcsFile, $stackPtr)
93
-    {
94
-        $tokens = $phpcsFile->getTokens();
95
-
96
-        $ignore = array(
97
-            \T_DOUBLE_COLON    => true,
98
-            \T_OBJECT_OPERATOR => true,
99
-            \T_FUNCTION        => true,
100
-            \T_CONST           => true,
101
-        );
102
-
103
-        $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
104
-        if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
105
-            // Not a call to a PHP function.
106
-            return;
107
-        }
108
-
109
-        $function   = $tokens[$stackPtr]['content'];
110
-        $functionLc = strtolower($function);
111
-
112
-        if (isset($this->removedFunctionParameters[$functionLc]) === false) {
113
-            return;
114
-        }
115
-
116
-        $parameterCount = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr);
117
-        if ($parameterCount === 0) {
118
-            return;
119
-        }
120
-
121
-        // If the parameter count returned > 0, we know there will be valid open parenthesis.
122
-        $openParenthesis      = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true);
123
-        $parameterOffsetFound = $parameterCount - 1;
124
-
125
-        foreach ($this->removedFunctionParameters[$functionLc] as $offset => $parameterDetails) {
126
-            if ($offset <= $parameterOffsetFound) {
127
-                $itemInfo = array(
128
-                    'name'   => $function,
129
-                    'nameLc' => $functionLc,
130
-                    'offset' => $offset,
131
-                );
132
-                $this->handleFeature($phpcsFile, $openParenthesis, $itemInfo);
133
-            }
134
-        }
135
-    }
136
-
137
-
138
-    /**
139
-     * Get the relevant sub-array for a specific item from a multi-dimensional array.
140
-     *
141
-     * @param array $itemInfo Base information about the item.
142
-     *
143
-     * @return array Version and other information about the item.
144
-     */
145
-    public function getItemArray(array $itemInfo)
146
-    {
147
-        return $this->removedFunctionParameters[$itemInfo['nameLc']][$itemInfo['offset']];
148
-    }
149
-
150
-
151
-    /**
152
-     * Get an array of the non-PHP-version array keys used in a sub-array.
153
-     *
154
-     * @return array
155
-     */
156
-    protected function getNonVersionArrayKeys()
157
-    {
158
-        return array('name');
159
-    }
160
-
161
-
162
-    /**
163
-     * Retrieve the relevant detail (version) information for use in an error message.
164
-     *
165
-     * @param array $itemArray Version and other information about the item.
166
-     * @param array $itemInfo  Base information about the item.
167
-     *
168
-     * @return array
169
-     */
170
-    public function getErrorInfo(array $itemArray, array $itemInfo)
171
-    {
172
-        $errorInfo              = parent::getErrorInfo($itemArray, $itemInfo);
173
-        $errorInfo['paramName'] = $itemArray['name'];
174
-
175
-        return $errorInfo;
176
-    }
177
-
178
-
179
-    /**
180
-     * Get the item name to be used for the creation of the error code.
181
-     *
182
-     * @param array $itemInfo  Base information about the item.
183
-     * @param array $errorInfo Detail information about an item.
184
-     *
185
-     * @return string
186
-     */
187
-    protected function getItemName(array $itemInfo, array $errorInfo)
188
-    {
189
-        return $itemInfo['name'] . '_' . $errorInfo['paramName'];
190
-    }
191
-
192
-
193
-    /**
194
-     * Get the error message template for this sniff.
195
-     *
196
-     * @return string
197
-     */
198
-    protected function getErrorMsgTemplate()
199
-    {
200
-        return 'The "%s" parameter for function %s() is ';
201
-    }
202
-
203
-
204
-    /**
205
-     * Filter the error data before it's passed to PHPCS.
206
-     *
207
-     * @param array $data      The error data array which was created.
208
-     * @param array $itemInfo  Base information about the item this error message applies to.
209
-     * @param array $errorInfo Detail information about an item this error message applies to.
210
-     *
211
-     * @return array
212
-     */
213
-    protected function filterErrorData(array $data, array $itemInfo, array $errorInfo)
214
-    {
215
-        array_shift($data);
216
-        array_unshift($data, $errorInfo['paramName'], $itemInfo['name']);
217
-        return $data;
218
-    }
25
+	/**
26
+	 * A list of removed function parameters, which were present in older versions.
27
+	 *
28
+	 * The array lists : version number with false (deprecated) and true (removed).
29
+	 * The index is the location of the parameter in the parameter list, starting at 0 !
30
+	 * If's sufficient to list the first version where the function parameter was deprecated/removed.
31
+	 *
32
+	 * @var array
33
+	 */
34
+	protected $removedFunctionParameters = array(
35
+		'define' => array(
36
+			2 => array(
37
+				'name' => 'case_insensitive',
38
+				'7.3'  => false, // Slated for removal in PHP 8.0.0.
39
+			),
40
+		),
41
+		'gmmktime' => array(
42
+			6 => array(
43
+				'name' => 'is_dst',
44
+				'5.1'  => false,
45
+				'7.0'  => true,
46
+			),
47
+		),
48
+		'ldap_first_attribute' => array(
49
+			2 => array(
50
+				'name'  => 'ber_identifier',
51
+				'5.2.4' => true,
52
+			),
53
+		),
54
+		'ldap_next_attribute' => array(
55
+			2 => array(
56
+				'name'  => 'ber_identifier',
57
+				'5.2.4' => true,
58
+			),
59
+		),
60
+		'mktime' => array(
61
+			6 => array(
62
+				'name' => 'is_dst',
63
+				'5.1'  => false,
64
+				'7.0'  => true,
65
+			),
66
+		),
67
+	);
68
+
69
+
70
+	/**
71
+	 * Returns an array of tokens this test wants to listen for.
72
+	 *
73
+	 * @return array
74
+	 */
75
+	public function register()
76
+	{
77
+		// Handle case-insensitivity of function names.
78
+		$this->removedFunctionParameters = $this->arrayKeysToLowercase($this->removedFunctionParameters);
79
+
80
+		return array(\T_STRING);
81
+	}
82
+
83
+	/**
84
+	 * Processes this test, when one of its tokens is encountered.
85
+	 *
86
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
87
+	 * @param int                   $stackPtr  The position of the current token in
88
+	 *                                         the stack passed in $tokens.
89
+	 *
90
+	 * @return void
91
+	 */
92
+	public function process(File $phpcsFile, $stackPtr)
93
+	{
94
+		$tokens = $phpcsFile->getTokens();
95
+
96
+		$ignore = array(
97
+			\T_DOUBLE_COLON    => true,
98
+			\T_OBJECT_OPERATOR => true,
99
+			\T_FUNCTION        => true,
100
+			\T_CONST           => true,
101
+		);
102
+
103
+		$prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
104
+		if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
105
+			// Not a call to a PHP function.
106
+			return;
107
+		}
108
+
109
+		$function   = $tokens[$stackPtr]['content'];
110
+		$functionLc = strtolower($function);
111
+
112
+		if (isset($this->removedFunctionParameters[$functionLc]) === false) {
113
+			return;
114
+		}
115
+
116
+		$parameterCount = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr);
117
+		if ($parameterCount === 0) {
118
+			return;
119
+		}
120
+
121
+		// If the parameter count returned > 0, we know there will be valid open parenthesis.
122
+		$openParenthesis      = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true);
123
+		$parameterOffsetFound = $parameterCount - 1;
124
+
125
+		foreach ($this->removedFunctionParameters[$functionLc] as $offset => $parameterDetails) {
126
+			if ($offset <= $parameterOffsetFound) {
127
+				$itemInfo = array(
128
+					'name'   => $function,
129
+					'nameLc' => $functionLc,
130
+					'offset' => $offset,
131
+				);
132
+				$this->handleFeature($phpcsFile, $openParenthesis, $itemInfo);
133
+			}
134
+		}
135
+	}
136
+
137
+
138
+	/**
139
+	 * Get the relevant sub-array for a specific item from a multi-dimensional array.
140
+	 *
141
+	 * @param array $itemInfo Base information about the item.
142
+	 *
143
+	 * @return array Version and other information about the item.
144
+	 */
145
+	public function getItemArray(array $itemInfo)
146
+	{
147
+		return $this->removedFunctionParameters[$itemInfo['nameLc']][$itemInfo['offset']];
148
+	}
149
+
150
+
151
+	/**
152
+	 * Get an array of the non-PHP-version array keys used in a sub-array.
153
+	 *
154
+	 * @return array
155
+	 */
156
+	protected function getNonVersionArrayKeys()
157
+	{
158
+		return array('name');
159
+	}
160
+
161
+
162
+	/**
163
+	 * Retrieve the relevant detail (version) information for use in an error message.
164
+	 *
165
+	 * @param array $itemArray Version and other information about the item.
166
+	 * @param array $itemInfo  Base information about the item.
167
+	 *
168
+	 * @return array
169
+	 */
170
+	public function getErrorInfo(array $itemArray, array $itemInfo)
171
+	{
172
+		$errorInfo              = parent::getErrorInfo($itemArray, $itemInfo);
173
+		$errorInfo['paramName'] = $itemArray['name'];
174
+
175
+		return $errorInfo;
176
+	}
177
+
178
+
179
+	/**
180
+	 * Get the item name to be used for the creation of the error code.
181
+	 *
182
+	 * @param array $itemInfo  Base information about the item.
183
+	 * @param array $errorInfo Detail information about an item.
184
+	 *
185
+	 * @return string
186
+	 */
187
+	protected function getItemName(array $itemInfo, array $errorInfo)
188
+	{
189
+		return $itemInfo['name'] . '_' . $errorInfo['paramName'];
190
+	}
191
+
192
+
193
+	/**
194
+	 * Get the error message template for this sniff.
195
+	 *
196
+	 * @return string
197
+	 */
198
+	protected function getErrorMsgTemplate()
199
+	{
200
+		return 'The "%s" parameter for function %s() is ';
201
+	}
202
+
203
+
204
+	/**
205
+	 * Filter the error data before it's passed to PHPCS.
206
+	 *
207
+	 * @param array $data      The error data array which was created.
208
+	 * @param array $itemInfo  Base information about the item this error message applies to.
209
+	 * @param array $errorInfo Detail information about an item this error message applies to.
210
+	 *
211
+	 * @return array
212
+	 */
213
+	protected function filterErrorData(array $data, array $itemInfo, array $errorInfo)
214
+	{
215
+		array_shift($data);
216
+		array_unshift($data, $errorInfo['paramName'], $itemInfo['name']);
217
+		return $data;
218
+	}
219 219
 }
Please login to merge, or discard this patch.
Sniffs/FunctionUse/OptionalToRequiredFunctionParametersSniff.php 1 patch
Indentation   +134 added lines, -134 removed lines patch added patch discarded remove patch
@@ -22,138 +22,138 @@
 block discarded – undo
22 22
 class OptionalToRequiredFunctionParametersSniff extends RequiredToOptionalFunctionParametersSniff
23 23
 {
24 24
 
25
-    /**
26
-     * A list of function parameters, which were optional in older versions and became required later on.
27
-     *
28
-     * The array lists : version number with true (required) and false (optional use deprecated).
29
-     *
30
-     * The index is the location of the parameter in the parameter list, starting at 0 !
31
-     * If's sufficient to list the last version in which the parameter was not yet required.
32
-     *
33
-     * @var array
34
-     */
35
-    protected $functionParameters = array(
36
-        // Special case, the optional nature is not deprecated, but usage is recommended
37
-        // and leaving the parameter out will throw an E_NOTICE.
38
-        'crypt' => array(
39
-            1 => array(
40
-                'name' => 'salt',
41
-                '5.6'  => 'recommended',
42
-            ),
43
-        ),
44
-        'parse_str' => array(
45
-            1 => array(
46
-                'name' => 'result',
47
-                '7.2'  => false,
48
-            ),
49
-        ),
50
-    );
51
-
52
-
53
-    /**
54
-     * Determine whether an error/warning should be thrown for an item based on collected information.
55
-     *
56
-     * @param array $errorInfo Detail information about an item.
57
-     *
58
-     * @return bool
59
-     */
60
-    protected function shouldThrowError(array $errorInfo)
61
-    {
62
-        return ($errorInfo['optionalDeprecated'] !== ''
63
-            || $errorInfo['optionalRemoved'] !== ''
64
-            || $errorInfo['optionalRecommended'] !== '');
65
-    }
66
-
67
-
68
-    /**
69
-     * Retrieve the relevant detail (version) information for use in an error message.
70
-     *
71
-     * @param array $itemArray Version and other information about the item.
72
-     * @param array $itemInfo  Base information about the item.
73
-     *
74
-     * @return array
75
-     */
76
-    public function getErrorInfo(array $itemArray, array $itemInfo)
77
-    {
78
-        $errorInfo = array(
79
-            'paramName'           => '',
80
-            'optionalRecommended' => '',
81
-            'optionalDeprecated'  => '',
82
-            'optionalRemoved'     => '',
83
-            'error'               => false,
84
-        );
85
-
86
-        $versionArray = $this->getVersionArray($itemArray);
87
-
88
-        if (empty($versionArray) === false) {
89
-            foreach ($versionArray as $version => $required) {
90
-                if ($this->supportsAbove($version) === true) {
91
-                    if ($required === true && $errorInfo['optionalRemoved'] === '') {
92
-                        $errorInfo['optionalRemoved'] = $version;
93
-                        $errorInfo['error']           = true;
94
-                    } elseif ($required === 'recommended' && $errorInfo['optionalRecommended'] === '') {
95
-                        $errorInfo['optionalRecommended'] = $version;
96
-                    } elseif ($errorInfo['optionalDeprecated'] === '') {
97
-                        $errorInfo['optionalDeprecated'] = $version;
98
-                    }
99
-                }
100
-            }
101
-        }
102
-
103
-        $errorInfo['paramName'] = $itemArray['name'];
104
-
105
-        return $errorInfo;
106
-    }
107
-
108
-
109
-    /**
110
-     * Generates the error or warning for this item.
111
-     *
112
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
113
-     * @param int                   $stackPtr  The position of the relevant token in
114
-     *                                         the stack.
115
-     * @param array                 $itemInfo  Base information about the item.
116
-     * @param array                 $errorInfo Array with detail (version) information
117
-     *                                         relevant to the item.
118
-     *
119
-     * @return void
120
-     */
121
-    public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo)
122
-    {
123
-        $error = 'The "%s" parameter for function %s() is missing. Passing this parameter is ';
124
-        if ($errorInfo['optionalRecommended'] === '') {
125
-            $error .= 'no longer optional. The optional nature of the parameter is ';
126
-        } else {
127
-            $error .= 'strongly recommended ';
128
-        }
129
-
130
-        $errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']);
131
-        $data      = array(
132
-            $errorInfo['paramName'],
133
-            $itemInfo['name'],
134
-        );
135
-
136
-        if ($errorInfo['optionalRecommended'] !== '') {
137
-            $error     .= 'since PHP %s ';
138
-            $errorCode .= 'SoftRecommended';
139
-            $data[]     = $errorInfo['optionalRecommended'];
140
-        } else {
141
-            if ($errorInfo['optionalDeprecated'] !== '') {
142
-                $error     .= 'deprecated since PHP %s and ';
143
-                $errorCode .= 'SoftRequired';
144
-                $data[]     = $errorInfo['optionalDeprecated'];
145
-            }
146
-
147
-            if ($errorInfo['optionalRemoved'] !== '') {
148
-                $error     .= 'removed since PHP %s and ';
149
-                $errorCode .= 'HardRequired';
150
-                $data[]     = $errorInfo['optionalRemoved'];
151
-            }
152
-
153
-            // Remove the last 'and' from the message.
154
-            $error = substr($error, 0, (\strlen($error) - 5));
155
-        }
156
-
157
-        $this->addMessage($phpcsFile, $error, $stackPtr, $errorInfo['error'], $errorCode, $data);
158
-    }
25
+	/**
26
+	 * A list of function parameters, which were optional in older versions and became required later on.
27
+	 *
28
+	 * The array lists : version number with true (required) and false (optional use deprecated).
29
+	 *
30
+	 * The index is the location of the parameter in the parameter list, starting at 0 !
31
+	 * If's sufficient to list the last version in which the parameter was not yet required.
32
+	 *
33
+	 * @var array
34
+	 */
35
+	protected $functionParameters = array(
36
+		// Special case, the optional nature is not deprecated, but usage is recommended
37
+		// and leaving the parameter out will throw an E_NOTICE.
38
+		'crypt' => array(
39
+			1 => array(
40
+				'name' => 'salt',
41
+				'5.6'  => 'recommended',
42
+			),
43
+		),
44
+		'parse_str' => array(
45
+			1 => array(
46
+				'name' => 'result',
47
+				'7.2'  => false,
48
+			),
49
+		),
50
+	);
51
+
52
+
53
+	/**
54
+	 * Determine whether an error/warning should be thrown for an item based on collected information.
55
+	 *
56
+	 * @param array $errorInfo Detail information about an item.
57
+	 *
58
+	 * @return bool
59
+	 */
60
+	protected function shouldThrowError(array $errorInfo)
61
+	{
62
+		return ($errorInfo['optionalDeprecated'] !== ''
63
+			|| $errorInfo['optionalRemoved'] !== ''
64
+			|| $errorInfo['optionalRecommended'] !== '');
65
+	}
66
+
67
+
68
+	/**
69
+	 * Retrieve the relevant detail (version) information for use in an error message.
70
+	 *
71
+	 * @param array $itemArray Version and other information about the item.
72
+	 * @param array $itemInfo  Base information about the item.
73
+	 *
74
+	 * @return array
75
+	 */
76
+	public function getErrorInfo(array $itemArray, array $itemInfo)
77
+	{
78
+		$errorInfo = array(
79
+			'paramName'           => '',
80
+			'optionalRecommended' => '',
81
+			'optionalDeprecated'  => '',
82
+			'optionalRemoved'     => '',
83
+			'error'               => false,
84
+		);
85
+
86
+		$versionArray = $this->getVersionArray($itemArray);
87
+
88
+		if (empty($versionArray) === false) {
89
+			foreach ($versionArray as $version => $required) {
90
+				if ($this->supportsAbove($version) === true) {
91
+					if ($required === true && $errorInfo['optionalRemoved'] === '') {
92
+						$errorInfo['optionalRemoved'] = $version;
93
+						$errorInfo['error']           = true;
94
+					} elseif ($required === 'recommended' && $errorInfo['optionalRecommended'] === '') {
95
+						$errorInfo['optionalRecommended'] = $version;
96
+					} elseif ($errorInfo['optionalDeprecated'] === '') {
97
+						$errorInfo['optionalDeprecated'] = $version;
98
+					}
99
+				}
100
+			}
101
+		}
102
+
103
+		$errorInfo['paramName'] = $itemArray['name'];
104
+
105
+		return $errorInfo;
106
+	}
107
+
108
+
109
+	/**
110
+	 * Generates the error or warning for this item.
111
+	 *
112
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
113
+	 * @param int                   $stackPtr  The position of the relevant token in
114
+	 *                                         the stack.
115
+	 * @param array                 $itemInfo  Base information about the item.
116
+	 * @param array                 $errorInfo Array with detail (version) information
117
+	 *                                         relevant to the item.
118
+	 *
119
+	 * @return void
120
+	 */
121
+	public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo)
122
+	{
123
+		$error = 'The "%s" parameter for function %s() is missing. Passing this parameter is ';
124
+		if ($errorInfo['optionalRecommended'] === '') {
125
+			$error .= 'no longer optional. The optional nature of the parameter is ';
126
+		} else {
127
+			$error .= 'strongly recommended ';
128
+		}
129
+
130
+		$errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']);
131
+		$data      = array(
132
+			$errorInfo['paramName'],
133
+			$itemInfo['name'],
134
+		);
135
+
136
+		if ($errorInfo['optionalRecommended'] !== '') {
137
+			$error     .= 'since PHP %s ';
138
+			$errorCode .= 'SoftRecommended';
139
+			$data[]     = $errorInfo['optionalRecommended'];
140
+		} else {
141
+			if ($errorInfo['optionalDeprecated'] !== '') {
142
+				$error     .= 'deprecated since PHP %s and ';
143
+				$errorCode .= 'SoftRequired';
144
+				$data[]     = $errorInfo['optionalDeprecated'];
145
+			}
146
+
147
+			if ($errorInfo['optionalRemoved'] !== '') {
148
+				$error     .= 'removed since PHP %s and ';
149
+				$errorCode .= 'HardRequired';
150
+				$data[]     = $errorInfo['optionalRemoved'];
151
+			}
152
+
153
+			// Remove the last 'and' from the message.
154
+			$error = substr($error, 0, (\strlen($error) - 5));
155
+		}
156
+
157
+		$this->addMessage($phpcsFile, $error, $stackPtr, $errorInfo['error'], $errorCode, $data);
158
+	}
159 159
 }
Please login to merge, or discard this patch.
php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionsSniff.php 1 patch
Indentation   +1915 added lines, -1915 removed lines patch added patch discarded remove patch
@@ -21,1944 +21,1944 @@
 block discarded – undo
21 21
  */
22 22
 class NewFunctionsSniff extends AbstractNewFeatureSniff
23 23
 {
24
-    /**
25
-     * A list of new functions, not present in older versions.
26
-     *
27
-     * The array lists : version number with false (not present) or true (present).
28
-     * If's sufficient to list the first version where the function appears.
29
-     *
30
-     * @var array(string => array(string => int|string|null))
31
-     */
32
-    protected $newFunctions = array(
33
-        'iterator_count' => array(
34
-            '5.0' => false,
35
-            '5.1' => true,
36
-        ),
37
-        'iterator_to_array' => array(
38
-            '5.0' => false,
39
-            '5.1' => true,
40
-        ),
41
-        'spl_autoload_call' => array(
42
-            '5.0' => false,
43
-            '5.1' => true,
44
-        ),
45
-        'spl_autoload_extensions' => array(
46
-            '5.0' => false,
47
-            '5.1' => true,
48
-        ),
49
-        'spl_autoload_functions' => array(
50
-            '5.0' => false,
51
-            '5.1' => true,
52
-        ),
53
-        'spl_autoload_register' => array(
54
-            '5.0' => false,
55
-            '5.1' => true,
56
-        ),
57
-        'spl_autoload_unregister' => array(
58
-            '5.0' => false,
59
-            '5.1' => true,
60
-        ),
61
-        'spl_autoload' => array(
62
-            '5.0' => false,
63
-            '5.1' => true,
64
-        ),
65
-        'hash_hmac' => array(
66
-            '5.1.1' => false,
67
-            '5.1.2' => true,
68
-        ),
69
-        'array_fill_keys' => array(
70
-            '5.1' => false,
71
-            '5.2' => true,
72
-        ),
73
-        'error_get_last' => array(
74
-            '5.1' => false,
75
-            '5.2' => true,
76
-        ),
77
-        'image_type_to_extension' => array(
78
-            '5.1' => false,
79
-            '5.2' => true,
80
-        ),
81
-        'memory_get_peak_usage' => array(
82
-            '5.1' => false,
83
-            '5.2' => true,
84
-        ),
85
-        'sys_get_temp_dir' => array(
86
-            '5.1' => false,
87
-            '5.2' => true,
88
-        ),
89
-        'timezone_abbreviations_list' => array(
90
-            '5.1' => false,
91
-            '5.2' => true,
92
-        ),
93
-        'timezone_identifiers_list' => array(
94
-            '5.1' => false,
95
-            '5.2' => true,
96
-        ),
97
-        'timezone_name_from_abbr' => array(
98
-            '5.1' => false,
99
-            '5.2' => true,
100
-        ),
101
-        'stream_socket_shutdown' => array(
102
-            '5.1' => false,
103
-            '5.2' => true,
104
-        ),
105
-        'imagegrabscreen' => array(
106
-            '5.1' => false,
107
-            '5.2' => true,
108
-        ),
109
-        'imagegrabwindow' => array(
110
-            '5.1' => false,
111
-            '5.2' => true,
112
-        ),
113
-        'libxml_disable_entity_loader' => array(
114
-            '5.1' => false,
115
-            '5.2' => true,
116
-        ),
117
-        'mb_stripos' => array(
118
-            '5.1' => false,
119
-            '5.2' => true,
120
-        ),
121
-        'mb_stristr' => array(
122
-            '5.1' => false,
123
-            '5.2' => true,
124
-        ),
125
-        'mb_strrchr' => array(
126
-            '5.1' => false,
127
-            '5.2' => true,
128
-        ),
129
-        'mb_strrichr' => array(
130
-            '5.1' => false,
131
-            '5.2' => true,
132
-        ),
133
-        'mb_strripos' => array(
134
-            '5.1' => false,
135
-            '5.2' => true,
136
-        ),
137
-        'ming_setSWFCompression' => array(
138
-            '5.1' => false,
139
-            '5.2' => true,
140
-        ),
141
-        'openssl_csr_get_public_key' => array(
142
-            '5.1' => false,
143
-            '5.2' => true,
144
-        ),
145
-        'openssl_csr_get_subject' => array(
146
-            '5.1' => false,
147
-            '5.2' => true,
148
-        ),
149
-        'openssl_pkey_get_details' => array(
150
-            '5.1' => false,
151
-            '5.2' => true,
152
-        ),
153
-        'spl_object_hash' => array(
154
-            '5.1' => false,
155
-            '5.2' => true,
156
-        ),
157
-        'iterator_apply' => array(
158
-            '5.1' => false,
159
-            '5.2' => true,
160
-        ),
161
-        'preg_last_error' => array(
162
-            '5.1' => false,
163
-            '5.2' => true,
164
-        ),
165
-        'pg_field_table' => array(
166
-            '5.1' => false,
167
-            '5.2' => true,
168
-        ),
169
-        'posix_initgroups' => array(
170
-            '5.1' => false,
171
-            '5.2' => true,
172
-        ),
173
-        'gmp_nextprime' => array(
174
-            '5.1' => false,
175
-            '5.2' => true,
176
-        ),
177
-        'xmlwriter_full_end_element' => array(
178
-            '5.1' => false,
179
-            '5.2' => true,
180
-        ),
181
-        'xmlwriter_write_raw' => array(
182
-            '5.1' => false,
183
-            '5.2' => true,
184
-        ),
185
-        'xmlwriter_start_dtd_entity' => array(
186
-            '5.1' => false,
187
-            '5.2' => true,
188
-        ),
189
-        'xmlwriter_end_dtd_entity' => array(
190
-            '5.1' => false,
191
-            '5.2' => true,
192
-        ),
193
-        'xmlwriter_write_dtd_entity' => array(
194
-            '5.1' => false,
195
-            '5.2' => true,
196
-        ),
197
-        'filter_has_var' => array(
198
-            '5.1' => false,
199
-            '5.2' => true,
200
-        ),
201
-        'filter_id' => array(
202
-            '5.1' => false,
203
-            '5.2' => true,
204
-        ),
205
-        'filter_input_array' => array(
206
-            '5.1' => false,
207
-            '5.2' => true,
208
-        ),
209
-        'filter_input' => array(
210
-            '5.1' => false,
211
-            '5.2' => true,
212
-        ),
213
-        'filter_list' => array(
214
-            '5.1' => false,
215
-            '5.2' => true,
216
-        ),
217
-        'filter_var_array' => array(
218
-            '5.1' => false,
219
-            '5.2' => true,
220
-        ),
221
-        'filter_var' => array(
222
-            '5.1' => false,
223
-            '5.2' => true,
224
-        ),
225
-        'json_decode' => array(
226
-            '5.1' => false,
227
-            '5.2' => true,
228
-        ),
229
-        'json_encode' => array(
230
-            '5.1' => false,
231
-            '5.2' => true,
232
-        ),
233
-        'zip_close' => array(
234
-            '5.1' => false,
235
-            '5.2' => true,
236
-        ),
237
-        'zip_entry_close' => array(
238
-            '5.1' => false,
239
-            '5.2' => true,
240
-        ),
241
-        'zip_entry_compressedsize' => array(
242
-            '5.1' => false,
243
-            '5.2' => true,
244
-        ),
245
-        'zip_entry_compressionmethod' => array(
246
-            '5.1' => false,
247
-            '5.2' => true,
248
-        ),
249
-        'zip_entry_filesize' => array(
250
-            '5.1' => false,
251
-            '5.2' => true,
252
-        ),
253
-        'zip_entry_name' => array(
254
-            '5.1' => false,
255
-            '5.2' => true,
256
-        ),
257
-        'zip_entry_open' => array(
258
-            '5.1' => false,
259
-            '5.2' => true,
260
-        ),
261
-        'zip_entry_read' => array(
262
-            '5.1' => false,
263
-            '5.2' => true,
264
-        ),
265
-        'zip_open' => array(
266
-            '5.1' => false,
267
-            '5.2' => true,
268
-        ),
269
-        'zip_read' => array(
270
-            '5.1' => false,
271
-            '5.2' => true,
272
-        ),
24
+	/**
25
+	 * A list of new functions, not present in older versions.
26
+	 *
27
+	 * The array lists : version number with false (not present) or true (present).
28
+	 * If's sufficient to list the first version where the function appears.
29
+	 *
30
+	 * @var array(string => array(string => int|string|null))
31
+	 */
32
+	protected $newFunctions = array(
33
+		'iterator_count' => array(
34
+			'5.0' => false,
35
+			'5.1' => true,
36
+		),
37
+		'iterator_to_array' => array(
38
+			'5.0' => false,
39
+			'5.1' => true,
40
+		),
41
+		'spl_autoload_call' => array(
42
+			'5.0' => false,
43
+			'5.1' => true,
44
+		),
45
+		'spl_autoload_extensions' => array(
46
+			'5.0' => false,
47
+			'5.1' => true,
48
+		),
49
+		'spl_autoload_functions' => array(
50
+			'5.0' => false,
51
+			'5.1' => true,
52
+		),
53
+		'spl_autoload_register' => array(
54
+			'5.0' => false,
55
+			'5.1' => true,
56
+		),
57
+		'spl_autoload_unregister' => array(
58
+			'5.0' => false,
59
+			'5.1' => true,
60
+		),
61
+		'spl_autoload' => array(
62
+			'5.0' => false,
63
+			'5.1' => true,
64
+		),
65
+		'hash_hmac' => array(
66
+			'5.1.1' => false,
67
+			'5.1.2' => true,
68
+		),
69
+		'array_fill_keys' => array(
70
+			'5.1' => false,
71
+			'5.2' => true,
72
+		),
73
+		'error_get_last' => array(
74
+			'5.1' => false,
75
+			'5.2' => true,
76
+		),
77
+		'image_type_to_extension' => array(
78
+			'5.1' => false,
79
+			'5.2' => true,
80
+		),
81
+		'memory_get_peak_usage' => array(
82
+			'5.1' => false,
83
+			'5.2' => true,
84
+		),
85
+		'sys_get_temp_dir' => array(
86
+			'5.1' => false,
87
+			'5.2' => true,
88
+		),
89
+		'timezone_abbreviations_list' => array(
90
+			'5.1' => false,
91
+			'5.2' => true,
92
+		),
93
+		'timezone_identifiers_list' => array(
94
+			'5.1' => false,
95
+			'5.2' => true,
96
+		),
97
+		'timezone_name_from_abbr' => array(
98
+			'5.1' => false,
99
+			'5.2' => true,
100
+		),
101
+		'stream_socket_shutdown' => array(
102
+			'5.1' => false,
103
+			'5.2' => true,
104
+		),
105
+		'imagegrabscreen' => array(
106
+			'5.1' => false,
107
+			'5.2' => true,
108
+		),
109
+		'imagegrabwindow' => array(
110
+			'5.1' => false,
111
+			'5.2' => true,
112
+		),
113
+		'libxml_disable_entity_loader' => array(
114
+			'5.1' => false,
115
+			'5.2' => true,
116
+		),
117
+		'mb_stripos' => array(
118
+			'5.1' => false,
119
+			'5.2' => true,
120
+		),
121
+		'mb_stristr' => array(
122
+			'5.1' => false,
123
+			'5.2' => true,
124
+		),
125
+		'mb_strrchr' => array(
126
+			'5.1' => false,
127
+			'5.2' => true,
128
+		),
129
+		'mb_strrichr' => array(
130
+			'5.1' => false,
131
+			'5.2' => true,
132
+		),
133
+		'mb_strripos' => array(
134
+			'5.1' => false,
135
+			'5.2' => true,
136
+		),
137
+		'ming_setSWFCompression' => array(
138
+			'5.1' => false,
139
+			'5.2' => true,
140
+		),
141
+		'openssl_csr_get_public_key' => array(
142
+			'5.1' => false,
143
+			'5.2' => true,
144
+		),
145
+		'openssl_csr_get_subject' => array(
146
+			'5.1' => false,
147
+			'5.2' => true,
148
+		),
149
+		'openssl_pkey_get_details' => array(
150
+			'5.1' => false,
151
+			'5.2' => true,
152
+		),
153
+		'spl_object_hash' => array(
154
+			'5.1' => false,
155
+			'5.2' => true,
156
+		),
157
+		'iterator_apply' => array(
158
+			'5.1' => false,
159
+			'5.2' => true,
160
+		),
161
+		'preg_last_error' => array(
162
+			'5.1' => false,
163
+			'5.2' => true,
164
+		),
165
+		'pg_field_table' => array(
166
+			'5.1' => false,
167
+			'5.2' => true,
168
+		),
169
+		'posix_initgroups' => array(
170
+			'5.1' => false,
171
+			'5.2' => true,
172
+		),
173
+		'gmp_nextprime' => array(
174
+			'5.1' => false,
175
+			'5.2' => true,
176
+		),
177
+		'xmlwriter_full_end_element' => array(
178
+			'5.1' => false,
179
+			'5.2' => true,
180
+		),
181
+		'xmlwriter_write_raw' => array(
182
+			'5.1' => false,
183
+			'5.2' => true,
184
+		),
185
+		'xmlwriter_start_dtd_entity' => array(
186
+			'5.1' => false,
187
+			'5.2' => true,
188
+		),
189
+		'xmlwriter_end_dtd_entity' => array(
190
+			'5.1' => false,
191
+			'5.2' => true,
192
+		),
193
+		'xmlwriter_write_dtd_entity' => array(
194
+			'5.1' => false,
195
+			'5.2' => true,
196
+		),
197
+		'filter_has_var' => array(
198
+			'5.1' => false,
199
+			'5.2' => true,
200
+		),
201
+		'filter_id' => array(
202
+			'5.1' => false,
203
+			'5.2' => true,
204
+		),
205
+		'filter_input_array' => array(
206
+			'5.1' => false,
207
+			'5.2' => true,
208
+		),
209
+		'filter_input' => array(
210
+			'5.1' => false,
211
+			'5.2' => true,
212
+		),
213
+		'filter_list' => array(
214
+			'5.1' => false,
215
+			'5.2' => true,
216
+		),
217
+		'filter_var_array' => array(
218
+			'5.1' => false,
219
+			'5.2' => true,
220
+		),
221
+		'filter_var' => array(
222
+			'5.1' => false,
223
+			'5.2' => true,
224
+		),
225
+		'json_decode' => array(
226
+			'5.1' => false,
227
+			'5.2' => true,
228
+		),
229
+		'json_encode' => array(
230
+			'5.1' => false,
231
+			'5.2' => true,
232
+		),
233
+		'zip_close' => array(
234
+			'5.1' => false,
235
+			'5.2' => true,
236
+		),
237
+		'zip_entry_close' => array(
238
+			'5.1' => false,
239
+			'5.2' => true,
240
+		),
241
+		'zip_entry_compressedsize' => array(
242
+			'5.1' => false,
243
+			'5.2' => true,
244
+		),
245
+		'zip_entry_compressionmethod' => array(
246
+			'5.1' => false,
247
+			'5.2' => true,
248
+		),
249
+		'zip_entry_filesize' => array(
250
+			'5.1' => false,
251
+			'5.2' => true,
252
+		),
253
+		'zip_entry_name' => array(
254
+			'5.1' => false,
255
+			'5.2' => true,
256
+		),
257
+		'zip_entry_open' => array(
258
+			'5.1' => false,
259
+			'5.2' => true,
260
+		),
261
+		'zip_entry_read' => array(
262
+			'5.1' => false,
263
+			'5.2' => true,
264
+		),
265
+		'zip_open' => array(
266
+			'5.1' => false,
267
+			'5.2' => true,
268
+		),
269
+		'zip_read' => array(
270
+			'5.1' => false,
271
+			'5.2' => true,
272
+		),
273 273
 
274
-        'array_replace' => array(
275
-            '5.2' => false,
276
-            '5.3' => true,
277
-        ),
278
-        'array_replace_recursive' => array(
279
-            '5.2' => false,
280
-            '5.3' => true,
281
-        ),
282
-        'class_alias' => array(
283
-            '5.2' => false,
284
-            '5.3' => true,
285
-        ),
286
-        'forward_static_call' => array(
287
-            '5.2' => false,
288
-            '5.3' => true,
289
-        ),
290
-        'forward_static_call_array' => array(
291
-            '5.2' => false,
292
-            '5.3' => true,
293
-        ),
294
-        'gc_collect_cycles' => array(
295
-            '5.2' => false,
296
-            '5.3' => true,
297
-        ),
298
-        'gc_disable' => array(
299
-            '5.2' => false,
300
-            '5.3' => true,
301
-        ),
302
-        'gc_enable' => array(
303
-            '5.2' => false,
304
-            '5.3' => true,
305
-        ),
306
-        'gc_enabled' => array(
307
-            '5.2' => false,
308
-            '5.3' => true,
309
-        ),
310
-        'get_called_class' => array(
311
-            '5.2' => false,
312
-            '5.3' => true,
313
-        ),
314
-        'gethostname' => array(
315
-            '5.2' => false,
316
-            '5.3' => true,
317
-        ),
318
-        'header_remove' => array(
319
-            '5.2' => false,
320
-            '5.3' => true,
321
-        ),
322
-        'lcfirst' => array(
323
-            '5.2' => false,
324
-            '5.3' => true,
325
-        ),
326
-        'parse_ini_string' => array(
327
-            '5.2' => false,
328
-            '5.3' => true,
329
-        ),
330
-        'quoted_printable_encode' => array(
331
-            '5.2' => false,
332
-            '5.3' => true,
333
-        ),
334
-        'str_getcsv' => array(
335
-            '5.2' => false,
336
-            '5.3' => true,
337
-        ),
338
-        'stream_context_set_default' => array(
339
-            '5.2' => false,
340
-            '5.3' => true,
341
-        ),
342
-        'stream_supports_lock' => array(
343
-            '5.2' => false,
344
-            '5.3' => true,
345
-        ),
346
-        'stream_context_get_params' => array(
347
-            '5.2' => false,
348
-            '5.3' => true,
349
-        ),
350
-        'date_add' => array(
351
-            '5.2' => false,
352
-            '5.3' => true,
353
-        ),
354
-        'date_create_from_format' => array(
355
-            '5.2' => false,
356
-            '5.3' => true,
357
-        ),
358
-        'date_diff' => array(
359
-            '5.2' => false,
360
-            '5.3' => true,
361
-        ),
362
-        'date_get_last_errors' => array(
363
-            '5.2' => false,
364
-            '5.3' => true,
365
-        ),
366
-        'date_parse_from_format' => array(
367
-            '5.2' => false,
368
-            '5.3' => true,
369
-        ),
370
-        'date_sub' => array(
371
-            '5.2' => false,
372
-            '5.3' => true,
373
-        ),
374
-        'timezone_version_get' => array(
375
-            '5.2' => false,
376
-            '5.3' => true,
377
-        ),
378
-        'gmp_testbit' => array(
379
-            '5.2' => false,
380
-            '5.3' => true,
381
-        ),
382
-        'hash_copy' => array(
383
-            '5.2' => false,
384
-            '5.3' => true,
385
-        ),
386
-        'imap_gc' => array(
387
-            '5.2' => false,
388
-            '5.3' => true,
389
-        ),
390
-        'imap_utf8_to_mutf7' => array(
391
-            '5.2' => false,
392
-            '5.3' => true,
393
-        ),
394
-        'imap_mutf7_to_utf8' => array(
395
-            '5.2' => false,
396
-            '5.3' => true,
397
-        ),
398
-        'json_last_error' => array(
399
-            '5.2' => false,
400
-            '5.3' => true,
401
-        ),
402
-        'mysqli_get_cache_stats' => array(
403
-            '5.2' => false,
404
-            '5.3' => true,
405
-        ),
406
-        'mysqli_fetch_all' => array(
407
-            '5.2' => false,
408
-            '5.3' => true,
409
-        ),
410
-        'mysqli_get_connection_status' => array(
411
-            '5.2' => false,
412
-            '5.3' => true,
413
-        ),
414
-        'mysqli_poll' => array(
415
-            '5.2' => false,
416
-            '5.3' => true,
417
-        ),
418
-        'mysqli_read_async_query' => array(
419
-            '5.2' => false,
420
-            '5.3' => true,
421
-        ),
422
-        'openssl_random_pseudo_bytes' => array(
423
-            '5.2' => false,
424
-            '5.3' => true,
425
-        ),
426
-        'pcntl_signal_dispatch' => array(
427
-            '5.2' => false,
428
-            '5.3' => true,
429
-        ),
430
-        'pcntl_sigprocmask' => array(
431
-            '5.2' => false,
432
-            '5.3' => true,
433
-        ),
434
-        'pcntl_sigtimedwait' => array(
435
-            '5.2' => false,
436
-            '5.3' => true,
437
-        ),
438
-        'pcntl_sigwaitinfo' => array(
439
-            '5.2' => false,
440
-            '5.3' => true,
441
-        ),
442
-        'preg_filter' => array(
443
-            '5.2' => false,
444
-            '5.3' => true,
445
-        ),
446
-        'msg_queue_exists' => array(
447
-            '5.2' => false,
448
-            '5.3' => true,
449
-        ),
450
-        'shm_has_vars' => array(
451
-            '5.2' => false,
452
-            '5.3' => true,
453
-        ),
454
-        'acosh' => array(
455
-            '5.2' => false,
456
-            '5.3' => true,
457
-        ),
458
-        'asinh' => array(
459
-            '5.2' => false,
460
-            '5.3' => true,
461
-        ),
462
-        'atanh' => array(
463
-            '5.2' => false,
464
-            '5.3' => true,
465
-        ),
466
-        'expm1' => array(
467
-            '5.2' => false,
468
-            '5.3' => true,
469
-        ),
470
-        'log1p' => array(
471
-            '5.2' => false,
472
-            '5.3' => true,
473
-        ),
474
-        'enchant_broker_describe' => array(
475
-            '5.2' => false,
476
-            '5.3' => true,
477
-        ),
478
-        'enchant_broker_dict_exists' => array(
479
-            '5.2' => false,
480
-            '5.3' => true,
481
-        ),
482
-        'enchant_broker_free_dict' => array(
483
-            '5.2' => false,
484
-            '5.3' => true,
485
-        ),
486
-        'enchant_broker_free' => array(
487
-            '5.2' => false,
488
-            '5.3' => true,
489
-        ),
490
-        'enchant_broker_get_error' => array(
491
-            '5.2' => false,
492
-            '5.3' => true,
493
-        ),
494
-        'enchant_broker_init' => array(
495
-            '5.2' => false,
496
-            '5.3' => true,
497
-        ),
498
-        'enchant_broker_list_dicts' => array(
499
-            '5.2' => false,
500
-            '5.3' => true,
501
-        ),
502
-        'enchant_broker_request_dict' => array(
503
-            '5.2' => false,
504
-            '5.3' => true,
505
-        ),
506
-        'enchant_broker_request_pwl_dict' => array(
507
-            '5.2' => false,
508
-            '5.3' => true,
509
-        ),
510
-        'enchant_broker_set_ordering' => array(
511
-            '5.2' => false,
512
-            '5.3' => true,
513
-        ),
514
-        'enchant_dict_add_to_personal' => array(
515
-            '5.2' => false,
516
-            '5.3' => true,
517
-        ),
518
-        'enchant_dict_add_to_session' => array(
519
-            '5.2' => false,
520
-            '5.3' => true,
521
-        ),
522
-        'enchant_dict_check' => array(
523
-            '5.2' => false,
524
-            '5.3' => true,
525
-        ),
526
-        'enchant_dict_describe' => array(
527
-            '5.2' => false,
528
-            '5.3' => true,
529
-        ),
530
-        'enchant_dict_get_error' => array(
531
-            '5.2' => false,
532
-            '5.3' => true,
533
-        ),
534
-        'enchant_dict_is_in_session' => array(
535
-            '5.2' => false,
536
-            '5.3' => true,
537
-        ),
538
-        'enchant_dict_quick_check' => array(
539
-            '5.2' => false,
540
-            '5.3' => true,
541
-        ),
542
-        'enchant_dict_store_replacement' => array(
543
-            '5.2' => false,
544
-            '5.3' => true,
545
-        ),
546
-        'enchant_dict_suggest' => array(
547
-            '5.2' => false,
548
-            '5.3' => true,
549
-        ),
550
-        'finfo_buffer' => array(
551
-            '5.2' => false,
552
-            '5.3' => true,
553
-        ),
554
-        'finfo_close' => array(
555
-            '5.2' => false,
556
-            '5.3' => true,
557
-        ),
558
-        'finfo_file' => array(
559
-            '5.2' => false,
560
-            '5.3' => true,
561
-        ),
562
-        'finfo_open' => array(
563
-            '5.2' => false,
564
-            '5.3' => true,
565
-        ),
566
-        'finfo_set_flags' => array(
567
-            '5.2' => false,
568
-            '5.3' => true,
569
-        ),
570
-        'intl_error_name' => array(
571
-            '5.2' => false,
572
-            '5.3' => true,
573
-        ),
574
-        'intl_get_error_code' => array(
575
-            '5.2' => false,
576
-            '5.3' => true,
577
-        ),
578
-        'intl_get_error_message' => array(
579
-            '5.2' => false,
580
-            '5.3' => true,
581
-        ),
582
-        'intl_is_failure' => array(
583
-            '5.2' => false,
584
-            '5.3' => true,
585
-        ),
274
+		'array_replace' => array(
275
+			'5.2' => false,
276
+			'5.3' => true,
277
+		),
278
+		'array_replace_recursive' => array(
279
+			'5.2' => false,
280
+			'5.3' => true,
281
+		),
282
+		'class_alias' => array(
283
+			'5.2' => false,
284
+			'5.3' => true,
285
+		),
286
+		'forward_static_call' => array(
287
+			'5.2' => false,
288
+			'5.3' => true,
289
+		),
290
+		'forward_static_call_array' => array(
291
+			'5.2' => false,
292
+			'5.3' => true,
293
+		),
294
+		'gc_collect_cycles' => array(
295
+			'5.2' => false,
296
+			'5.3' => true,
297
+		),
298
+		'gc_disable' => array(
299
+			'5.2' => false,
300
+			'5.3' => true,
301
+		),
302
+		'gc_enable' => array(
303
+			'5.2' => false,
304
+			'5.3' => true,
305
+		),
306
+		'gc_enabled' => array(
307
+			'5.2' => false,
308
+			'5.3' => true,
309
+		),
310
+		'get_called_class' => array(
311
+			'5.2' => false,
312
+			'5.3' => true,
313
+		),
314
+		'gethostname' => array(
315
+			'5.2' => false,
316
+			'5.3' => true,
317
+		),
318
+		'header_remove' => array(
319
+			'5.2' => false,
320
+			'5.3' => true,
321
+		),
322
+		'lcfirst' => array(
323
+			'5.2' => false,
324
+			'5.3' => true,
325
+		),
326
+		'parse_ini_string' => array(
327
+			'5.2' => false,
328
+			'5.3' => true,
329
+		),
330
+		'quoted_printable_encode' => array(
331
+			'5.2' => false,
332
+			'5.3' => true,
333
+		),
334
+		'str_getcsv' => array(
335
+			'5.2' => false,
336
+			'5.3' => true,
337
+		),
338
+		'stream_context_set_default' => array(
339
+			'5.2' => false,
340
+			'5.3' => true,
341
+		),
342
+		'stream_supports_lock' => array(
343
+			'5.2' => false,
344
+			'5.3' => true,
345
+		),
346
+		'stream_context_get_params' => array(
347
+			'5.2' => false,
348
+			'5.3' => true,
349
+		),
350
+		'date_add' => array(
351
+			'5.2' => false,
352
+			'5.3' => true,
353
+		),
354
+		'date_create_from_format' => array(
355
+			'5.2' => false,
356
+			'5.3' => true,
357
+		),
358
+		'date_diff' => array(
359
+			'5.2' => false,
360
+			'5.3' => true,
361
+		),
362
+		'date_get_last_errors' => array(
363
+			'5.2' => false,
364
+			'5.3' => true,
365
+		),
366
+		'date_parse_from_format' => array(
367
+			'5.2' => false,
368
+			'5.3' => true,
369
+		),
370
+		'date_sub' => array(
371
+			'5.2' => false,
372
+			'5.3' => true,
373
+		),
374
+		'timezone_version_get' => array(
375
+			'5.2' => false,
376
+			'5.3' => true,
377
+		),
378
+		'gmp_testbit' => array(
379
+			'5.2' => false,
380
+			'5.3' => true,
381
+		),
382
+		'hash_copy' => array(
383
+			'5.2' => false,
384
+			'5.3' => true,
385
+		),
386
+		'imap_gc' => array(
387
+			'5.2' => false,
388
+			'5.3' => true,
389
+		),
390
+		'imap_utf8_to_mutf7' => array(
391
+			'5.2' => false,
392
+			'5.3' => true,
393
+		),
394
+		'imap_mutf7_to_utf8' => array(
395
+			'5.2' => false,
396
+			'5.3' => true,
397
+		),
398
+		'json_last_error' => array(
399
+			'5.2' => false,
400
+			'5.3' => true,
401
+		),
402
+		'mysqli_get_cache_stats' => array(
403
+			'5.2' => false,
404
+			'5.3' => true,
405
+		),
406
+		'mysqli_fetch_all' => array(
407
+			'5.2' => false,
408
+			'5.3' => true,
409
+		),
410
+		'mysqli_get_connection_status' => array(
411
+			'5.2' => false,
412
+			'5.3' => true,
413
+		),
414
+		'mysqli_poll' => array(
415
+			'5.2' => false,
416
+			'5.3' => true,
417
+		),
418
+		'mysqli_read_async_query' => array(
419
+			'5.2' => false,
420
+			'5.3' => true,
421
+		),
422
+		'openssl_random_pseudo_bytes' => array(
423
+			'5.2' => false,
424
+			'5.3' => true,
425
+		),
426
+		'pcntl_signal_dispatch' => array(
427
+			'5.2' => false,
428
+			'5.3' => true,
429
+		),
430
+		'pcntl_sigprocmask' => array(
431
+			'5.2' => false,
432
+			'5.3' => true,
433
+		),
434
+		'pcntl_sigtimedwait' => array(
435
+			'5.2' => false,
436
+			'5.3' => true,
437
+		),
438
+		'pcntl_sigwaitinfo' => array(
439
+			'5.2' => false,
440
+			'5.3' => true,
441
+		),
442
+		'preg_filter' => array(
443
+			'5.2' => false,
444
+			'5.3' => true,
445
+		),
446
+		'msg_queue_exists' => array(
447
+			'5.2' => false,
448
+			'5.3' => true,
449
+		),
450
+		'shm_has_vars' => array(
451
+			'5.2' => false,
452
+			'5.3' => true,
453
+		),
454
+		'acosh' => array(
455
+			'5.2' => false,
456
+			'5.3' => true,
457
+		),
458
+		'asinh' => array(
459
+			'5.2' => false,
460
+			'5.3' => true,
461
+		),
462
+		'atanh' => array(
463
+			'5.2' => false,
464
+			'5.3' => true,
465
+		),
466
+		'expm1' => array(
467
+			'5.2' => false,
468
+			'5.3' => true,
469
+		),
470
+		'log1p' => array(
471
+			'5.2' => false,
472
+			'5.3' => true,
473
+		),
474
+		'enchant_broker_describe' => array(
475
+			'5.2' => false,
476
+			'5.3' => true,
477
+		),
478
+		'enchant_broker_dict_exists' => array(
479
+			'5.2' => false,
480
+			'5.3' => true,
481
+		),
482
+		'enchant_broker_free_dict' => array(
483
+			'5.2' => false,
484
+			'5.3' => true,
485
+		),
486
+		'enchant_broker_free' => array(
487
+			'5.2' => false,
488
+			'5.3' => true,
489
+		),
490
+		'enchant_broker_get_error' => array(
491
+			'5.2' => false,
492
+			'5.3' => true,
493
+		),
494
+		'enchant_broker_init' => array(
495
+			'5.2' => false,
496
+			'5.3' => true,
497
+		),
498
+		'enchant_broker_list_dicts' => array(
499
+			'5.2' => false,
500
+			'5.3' => true,
501
+		),
502
+		'enchant_broker_request_dict' => array(
503
+			'5.2' => false,
504
+			'5.3' => true,
505
+		),
506
+		'enchant_broker_request_pwl_dict' => array(
507
+			'5.2' => false,
508
+			'5.3' => true,
509
+		),
510
+		'enchant_broker_set_ordering' => array(
511
+			'5.2' => false,
512
+			'5.3' => true,
513
+		),
514
+		'enchant_dict_add_to_personal' => array(
515
+			'5.2' => false,
516
+			'5.3' => true,
517
+		),
518
+		'enchant_dict_add_to_session' => array(
519
+			'5.2' => false,
520
+			'5.3' => true,
521
+		),
522
+		'enchant_dict_check' => array(
523
+			'5.2' => false,
524
+			'5.3' => true,
525
+		),
526
+		'enchant_dict_describe' => array(
527
+			'5.2' => false,
528
+			'5.3' => true,
529
+		),
530
+		'enchant_dict_get_error' => array(
531
+			'5.2' => false,
532
+			'5.3' => true,
533
+		),
534
+		'enchant_dict_is_in_session' => array(
535
+			'5.2' => false,
536
+			'5.3' => true,
537
+		),
538
+		'enchant_dict_quick_check' => array(
539
+			'5.2' => false,
540
+			'5.3' => true,
541
+		),
542
+		'enchant_dict_store_replacement' => array(
543
+			'5.2' => false,
544
+			'5.3' => true,
545
+		),
546
+		'enchant_dict_suggest' => array(
547
+			'5.2' => false,
548
+			'5.3' => true,
549
+		),
550
+		'finfo_buffer' => array(
551
+			'5.2' => false,
552
+			'5.3' => true,
553
+		),
554
+		'finfo_close' => array(
555
+			'5.2' => false,
556
+			'5.3' => true,
557
+		),
558
+		'finfo_file' => array(
559
+			'5.2' => false,
560
+			'5.3' => true,
561
+		),
562
+		'finfo_open' => array(
563
+			'5.2' => false,
564
+			'5.3' => true,
565
+		),
566
+		'finfo_set_flags' => array(
567
+			'5.2' => false,
568
+			'5.3' => true,
569
+		),
570
+		'intl_error_name' => array(
571
+			'5.2' => false,
572
+			'5.3' => true,
573
+		),
574
+		'intl_get_error_code' => array(
575
+			'5.2' => false,
576
+			'5.3' => true,
577
+		),
578
+		'intl_get_error_message' => array(
579
+			'5.2' => false,
580
+			'5.3' => true,
581
+		),
582
+		'intl_is_failure' => array(
583
+			'5.2' => false,
584
+			'5.3' => true,
585
+		),
586 586
 
587
-        'hex2bin' => array(
588
-            '5.3' => false,
589
-            '5.4' => true,
590
-        ),
591
-        'http_response_code' => array(
592
-            '5.3' => false,
593
-            '5.4' => true,
594
-        ),
595
-        'get_declared_traits' => array(
596
-            '5.3' => false,
597
-            '5.4' => true,
598
-        ),
599
-        'getimagesizefromstring' => array(
600
-            '5.3' => false,
601
-            '5.4' => true,
602
-        ),
603
-        'stream_set_chunk_size' => array(
604
-            '5.3' => false,
605
-            '5.4' => true,
606
-        ),
607
-        'socket_import_stream' => array(
608
-            '5.3' => false,
609
-            '5.4' => true,
610
-        ),
611
-        'trait_exists' => array(
612
-            '5.3' => false,
613
-            '5.4' => true,
614
-        ),
615
-        'header_register_callback' => array(
616
-            '5.3' => false,
617
-            '5.4' => true,
618
-        ),
619
-        'class_uses' => array(
620
-            '5.3' => false,
621
-            '5.4' => true,
622
-        ),
623
-        'session_status' => array(
624
-            '5.3' => false,
625
-            '5.4' => true,
626
-        ),
627
-        'session_register_shutdown' => array(
628
-            '5.3' => false,
629
-            '5.4' => true,
630
-        ),
631
-        'mysqli_error_list' => array(
632
-            '5.3' => false,
633
-            '5.4' => true,
634
-        ),
635
-        'mysqli_stmt_error_list' => array(
636
-            '5.3' => false,
637
-            '5.4' => true,
638
-        ),
639
-        'libxml_set_external_entity_loader' => array(
640
-            '5.3' => false,
641
-            '5.4' => true,
642
-        ),
643
-        'ldap_control_paged_result' => array(
644
-            '5.3' => false,
645
-            '5.4' => true,
646
-        ),
647
-        'ldap_control_paged_result_response' => array(
648
-            '5.3' => false,
649
-            '5.4' => true,
650
-        ),
651
-        'transliteral_create' => array(
652
-            '5.3' => false,
653
-            '5.4' => true,
654
-        ),
655
-        'transliteral_create_from_rules' => array(
656
-            '5.3' => false,
657
-            '5.4' => true,
658
-        ),
659
-        'transliteral_create_inverse' => array(
660
-            '5.3' => false,
661
-            '5.4' => true,
662
-        ),
663
-        'transliteral_get_error_code' => array(
664
-            '5.3' => false,
665
-            '5.4' => true,
666
-        ),
667
-        'transliteral_get_error_message' => array(
668
-            '5.3' => false,
669
-            '5.4' => true,
670
-        ),
671
-        'transliteral_list_ids' => array(
672
-            '5.3' => false,
673
-            '5.4' => true,
674
-        ),
675
-        'transliteral_transliterate' => array(
676
-            '5.3' => false,
677
-            '5.4' => true,
678
-        ),
679
-        'zlib_decode' => array(
680
-            '5.3' => false,
681
-            '5.4' => true,
682
-        ),
683
-        'zlib_encode' => array(
684
-            '5.3' => false,
685
-            '5.4' => true,
686
-        ),
587
+		'hex2bin' => array(
588
+			'5.3' => false,
589
+			'5.4' => true,
590
+		),
591
+		'http_response_code' => array(
592
+			'5.3' => false,
593
+			'5.4' => true,
594
+		),
595
+		'get_declared_traits' => array(
596
+			'5.3' => false,
597
+			'5.4' => true,
598
+		),
599
+		'getimagesizefromstring' => array(
600
+			'5.3' => false,
601
+			'5.4' => true,
602
+		),
603
+		'stream_set_chunk_size' => array(
604
+			'5.3' => false,
605
+			'5.4' => true,
606
+		),
607
+		'socket_import_stream' => array(
608
+			'5.3' => false,
609
+			'5.4' => true,
610
+		),
611
+		'trait_exists' => array(
612
+			'5.3' => false,
613
+			'5.4' => true,
614
+		),
615
+		'header_register_callback' => array(
616
+			'5.3' => false,
617
+			'5.4' => true,
618
+		),
619
+		'class_uses' => array(
620
+			'5.3' => false,
621
+			'5.4' => true,
622
+		),
623
+		'session_status' => array(
624
+			'5.3' => false,
625
+			'5.4' => true,
626
+		),
627
+		'session_register_shutdown' => array(
628
+			'5.3' => false,
629
+			'5.4' => true,
630
+		),
631
+		'mysqli_error_list' => array(
632
+			'5.3' => false,
633
+			'5.4' => true,
634
+		),
635
+		'mysqli_stmt_error_list' => array(
636
+			'5.3' => false,
637
+			'5.4' => true,
638
+		),
639
+		'libxml_set_external_entity_loader' => array(
640
+			'5.3' => false,
641
+			'5.4' => true,
642
+		),
643
+		'ldap_control_paged_result' => array(
644
+			'5.3' => false,
645
+			'5.4' => true,
646
+		),
647
+		'ldap_control_paged_result_response' => array(
648
+			'5.3' => false,
649
+			'5.4' => true,
650
+		),
651
+		'transliteral_create' => array(
652
+			'5.3' => false,
653
+			'5.4' => true,
654
+		),
655
+		'transliteral_create_from_rules' => array(
656
+			'5.3' => false,
657
+			'5.4' => true,
658
+		),
659
+		'transliteral_create_inverse' => array(
660
+			'5.3' => false,
661
+			'5.4' => true,
662
+		),
663
+		'transliteral_get_error_code' => array(
664
+			'5.3' => false,
665
+			'5.4' => true,
666
+		),
667
+		'transliteral_get_error_message' => array(
668
+			'5.3' => false,
669
+			'5.4' => true,
670
+		),
671
+		'transliteral_list_ids' => array(
672
+			'5.3' => false,
673
+			'5.4' => true,
674
+		),
675
+		'transliteral_transliterate' => array(
676
+			'5.3' => false,
677
+			'5.4' => true,
678
+		),
679
+		'zlib_decode' => array(
680
+			'5.3' => false,
681
+			'5.4' => true,
682
+		),
683
+		'zlib_encode' => array(
684
+			'5.3' => false,
685
+			'5.4' => true,
686
+		),
687 687
 
688
-        'array_column' => array(
689
-            '5.4' => false,
690
-            '5.5' => true,
691
-        ),
692
-        'boolval' => array(
693
-            '5.4' => false,
694
-            '5.5' => true,
695
-        ),
696
-        'json_last_error_msg' => array(
697
-            '5.4' => false,
698
-            '5.5' => true,
699
-        ),
700
-        'password_get_info' => array(
701
-            '5.4' => false,
702
-            '5.5' => true,
703
-        ),
704
-        'password_hash' => array(
705
-            '5.4' => false,
706
-            '5.5' => true,
707
-        ),
708
-        'password_needs_rehash' => array(
709
-            '5.4' => false,
710
-            '5.5' => true,
711
-        ),
712
-        'password_verify' => array(
713
-            '5.4' => false,
714
-            '5.5' => true,
715
-        ),
716
-        'hash_pbkdf2' => array(
717
-            '5.4' => false,
718
-            '5.5' => true,
719
-        ),
720
-        'openssl_pbkdf2' => array(
721
-            '5.4' => false,
722
-            '5.5' => true,
723
-        ),
724
-        'curl_escape' => array(
725
-            '5.4' => false,
726
-            '5.5' => true,
727
-        ),
728
-        'curl_file_create' => array(
729
-            '5.4' => false,
730
-            '5.5' => true,
731
-        ),
732
-        'curl_multi_setopt' => array(
733
-            '5.4' => false,
734
-            '5.5' => true,
735
-        ),
736
-        'curl_multi_strerror' => array(
737
-            '5.4' => false,
738
-            '5.5' => true,
739
-        ),
740
-        'curl_pause' => array(
741
-            '5.4' => false,
742
-            '5.5' => true,
743
-        ),
744
-        'curl_reset' => array(
745
-            '5.4' => false,
746
-            '5.5' => true,
747
-        ),
748
-        'curl_share_close' => array(
749
-            '5.4' => false,
750
-            '5.5' => true,
751
-        ),
752
-        'curl_share_init' => array(
753
-            '5.4' => false,
754
-            '5.5' => true,
755
-        ),
756
-        'curl_share_setopt' => array(
757
-            '5.4' => false,
758
-            '5.5' => true,
759
-        ),
760
-        'curl_strerror' => array(
761
-            '5.4' => false,
762
-            '5.5' => true,
763
-        ),
764
-        'curl_unescape' => array(
765
-            '5.4' => false,
766
-            '5.5' => true,
767
-        ),
768
-        'imageaffinematrixconcat' => array(
769
-            '5.4' => false,
770
-            '5.5' => true,
771
-        ),
772
-        'imageaffinematrixget' => array(
773
-            '5.4' => false,
774
-            '5.5' => true,
775
-        ),
776
-        'imagecrop' => array(
777
-            '5.4' => false,
778
-            '5.5' => true,
779
-        ),
780
-        'imagecropauto' => array(
781
-            '5.4' => false,
782
-            '5.5' => true,
783
-        ),
784
-        'imageflip' => array(
785
-            '5.4' => false,
786
-            '5.5' => true,
787
-        ),
788
-        'imagepalettetotruecolor' => array(
789
-            '5.4' => false,
790
-            '5.5' => true,
791
-        ),
792
-        'imagescale' => array(
793
-            '5.4' => false,
794
-            '5.5' => true,
795
-        ),
796
-        'mysqli_begin_transaction' => array(
797
-            '5.4' => false,
798
-            '5.5' => true,
799
-        ),
800
-        'mysqli_release_savepoint' => array(
801
-            '5.4' => false,
802
-            '5.5' => true,
803
-        ),
804
-        'mysqli_savepoint' => array(
805
-            '5.4' => false,
806
-            '5.5' => true,
807
-        ),
808
-        'pg_escape_literal' => array(
809
-            '5.4' => false,
810
-            '5.5' => true,
811
-        ),
812
-        'pg_escape_identifier' => array(
813
-            '5.4' => false,
814
-            '5.5' => true,
815
-        ),
816
-        'socket_sendmsg' => array(
817
-            '5.4' => false,
818
-            '5.5' => true,
819
-        ),
820
-        'socket_recvmsg' => array(
821
-            '5.4' => false,
822
-            '5.5' => true,
823
-        ),
824
-        'socket_cmsg_space' => array(
825
-            '5.4' => false,
826
-            '5.5' => true,
827
-        ),
828
-        'cli_get_process_title' => array(
829
-            '5.4' => false,
830
-            '5.5' => true,
831
-        ),
832
-        'cli_set_process_title' => array(
833
-            '5.4' => false,
834
-            '5.5' => true,
835
-        ),
836
-        'datefmt_format_object' => array(
837
-            '5.4' => false,
838
-            '5.5' => true,
839
-        ),
840
-        'datefmt_get_calendar_object' => array(
841
-            '5.4' => false,
842
-            '5.5' => true,
843
-        ),
844
-        'datefmt_get_timezone' => array(
845
-            '5.4' => false,
846
-            '5.5' => true,
847
-        ),
848
-        'datefmt_set_timezone' => array(
849
-            '5.4' => false,
850
-            '5.5' => true,
851
-        ),
852
-        'datefmt_get_calendar_object' => array(
853
-            '5.4' => false,
854
-            '5.5' => true,
855
-        ),
856
-        'intlcal_create_instance' => array(
857
-            '5.4' => false,
858
-            '5.5' => true,
859
-        ),
860
-        'intlcal_get_keyword_values_for_locale' => array(
861
-            '5.4' => false,
862
-            '5.5' => true,
863
-        ),
864
-        'intlcal_get_now' => array(
865
-            '5.4' => false,
866
-            '5.5' => true,
867
-        ),
868
-        'intlcal_get_available_locales' => array(
869
-            '5.4' => false,
870
-            '5.5' => true,
871
-        ),
872
-        'intlcal_get' => array(
873
-            '5.4' => false,
874
-            '5.5' => true,
875
-        ),
876
-        'intlcal_get_time' => array(
877
-            '5.4' => false,
878
-            '5.5' => true,
879
-        ),
880
-        'intlcal_set_time' => array(
881
-            '5.4' => false,
882
-            '5.5' => true,
883
-        ),
884
-        'intlcal_add' => array(
885
-            '5.4' => false,
886
-            '5.5' => true,
887
-        ),
888
-        'intlcal_set_time_zone' => array(
889
-            '5.4' => false,
890
-            '5.5' => true,
891
-        ),
892
-        'intlcal_after' => array(
893
-            '5.4' => false,
894
-            '5.5' => true,
895
-        ),
896
-        'intlcal_before' => array(
897
-            '5.4' => false,
898
-            '5.5' => true,
899
-        ),
900
-        'intlcal_set' => array(
901
-            '5.4' => false,
902
-            '5.5' => true,
903
-        ),
904
-        'intlcal_roll' => array(
905
-            '5.4' => false,
906
-            '5.5' => true,
907
-        ),
908
-        'intlcal_clear' => array(
909
-            '5.4' => false,
910
-            '5.5' => true,
911
-        ),
912
-        'intlcal_field_difference' => array(
913
-            '5.4' => false,
914
-            '5.5' => true,
915
-        ),
916
-        'intlcal_get_actual_maximum' => array(
917
-            '5.4' => false,
918
-            '5.5' => true,
919
-        ),
920
-        'intlcal_get_actual_minumum' => array(
921
-            '5.4' => false,
922
-            '5.5' => true,
923
-        ),
924
-        'intlcal_get_day_of_week_type' => array(
925
-            '5.4' => false,
926
-            '5.5' => true,
927
-        ),
928
-        'intlcal_get_first_day_of_week' => array(
929
-            '5.4' => false,
930
-            '5.5' => true,
931
-        ),
932
-        'intlcal_get_greatest_minimum' => array(
933
-            '5.4' => false,
934
-            '5.5' => true,
935
-        ),
936
-        'intlcal_get_least_maximum' => array(
937
-            '5.4' => false,
938
-            '5.5' => true,
939
-        ),
940
-        'intlcal_get_locale' => array(
941
-            '5.4' => false,
942
-            '5.5' => true,
943
-        ),
944
-        'intlcal_get_maximum' => array(
945
-            '5.4' => false,
946
-            '5.5' => true,
947
-        ),
948
-        'intlcal_get_minimal_days_in_first_week' => array(
949
-            '5.4' => false,
950
-            '5.5' => true,
951
-        ),
952
-        'intlcal_get_minimum' => array(
953
-            '5.4' => false,
954
-            '5.5' => true,
955
-        ),
956
-        'intlcal_get_time_zone' => array(
957
-            '5.4' => false,
958
-            '5.5' => true,
959
-        ),
960
-        'intlcal_get_type' => array(
961
-            '5.4' => false,
962
-            '5.5' => true,
963
-        ),
964
-        'intlcal_get_weekend_transition' => array(
965
-            '5.4' => false,
966
-            '5.5' => true,
967
-        ),
968
-        'intlcal_in_daylight_time' => array(
969
-            '5.4' => false,
970
-            '5.5' => true,
971
-        ),
972
-        'intlcal_is_equivalent_to' => array(
973
-            '5.4' => false,
974
-            '5.5' => true,
975
-        ),
976
-        'intlcal_is_lenient' => array(
977
-            '5.4' => false,
978
-            '5.5' => true,
979
-        ),
980
-        'intlcal_equals' => array(
981
-            '5.4' => false,
982
-            '5.5' => true,
983
-        ),
984
-        'intlcal_get_repeated_wall_time_option' => array(
985
-            '5.4' => false,
986
-            '5.5' => true,
987
-        ),
988
-        'intlcal_get_skipped_wall_time_option' => array(
989
-            '5.4' => false,
990
-            '5.5' => true,
991
-        ),
992
-        'intlcal_set_repeated_wall_time_option' => array(
993
-            '5.4' => false,
994
-            '5.5' => true,
995
-        ),
996
-        'intlcal_set_skipped_wall_time_option' => array(
997
-            '5.4' => false,
998
-            '5.5' => true,
999
-        ),
1000
-        'intlcal_from_date_time' => array(
1001
-            '5.4' => false,
1002
-            '5.5' => true,
1003
-        ),
1004
-        'intlcal_to_date_time' => array(
1005
-            '5.4' => false,
1006
-            '5.5' => true,
1007
-        ),
1008
-        'intlcal_get_error_code' => array(
1009
-            '5.4' => false,
1010
-            '5.5' => true,
1011
-        ),
1012
-        'intlcal_get_error_message' => array(
1013
-            '5.4' => false,
1014
-            '5.5' => true,
1015
-        ),
1016
-        'intlgregcal_create_instance' => array(
1017
-            '5.4' => false,
1018
-            '5.5' => true,
1019
-        ),
1020
-        'intlgregcal_set_gregorian_change' => array(
1021
-            '5.4' => false,
1022
-            '5.5' => true,
1023
-        ),
1024
-        'intlgregcal_get_gregorian_change' => array(
1025
-            '5.4' => false,
1026
-            '5.5' => true,
1027
-        ),
1028
-        'intlgregcal_is_leap_year' => array(
1029
-            '5.4' => false,
1030
-            '5.5' => true,
1031
-        ),
1032
-        'intlz_create_time_zone' => array(
1033
-            '5.4' => false,
1034
-            '5.5' => true,
1035
-        ),
1036
-        'intlz_create_default' => array(
1037
-            '5.4' => false,
1038
-            '5.5' => true,
1039
-        ),
1040
-        'intlz_get_id' => array(
1041
-            '5.4' => false,
1042
-            '5.5' => true,
1043
-        ),
1044
-        'intlz_get_gmt' => array(
1045
-            '5.4' => false,
1046
-            '5.5' => true,
1047
-        ),
1048
-        'intlz_get_unknown' => array(
1049
-            '5.4' => false,
1050
-            '5.5' => true,
1051
-        ),
1052
-        'intlz_create_enumeration' => array(
1053
-            '5.4' => false,
1054
-            '5.5' => true,
1055
-        ),
1056
-        'intlz_count_equivalent_ids' => array(
1057
-            '5.4' => false,
1058
-            '5.5' => true,
1059
-        ),
1060
-        'intlz_create_time_zone_id_enumeration' => array(
1061
-            '5.4' => false,
1062
-            '5.5' => true,
1063
-        ),
1064
-        'intlz_get_canonical_id' => array(
1065
-            '5.4' => false,
1066
-            '5.5' => true,
1067
-        ),
1068
-        'intlz_get_region' => array(
1069
-            '5.4' => false,
1070
-            '5.5' => true,
1071
-        ),
1072
-        'intlz_get_tz_data_version' => array(
1073
-            '5.4' => false,
1074
-            '5.5' => true,
1075
-        ),
1076
-        'intlz_get_equivalent_id' => array(
1077
-            '5.4' => false,
1078
-            '5.5' => true,
1079
-        ),
1080
-        'intlz_use_daylight_time' => array(
1081
-            '5.4' => false,
1082
-            '5.5' => true,
1083
-        ),
1084
-        'intlz_get_offset' => array(
1085
-            '5.4' => false,
1086
-            '5.5' => true,
1087
-        ),
1088
-        'intlz_get_raw_offset' => array(
1089
-            '5.4' => false,
1090
-            '5.5' => true,
1091
-        ),
1092
-        'intlz_has_same_rules' => array(
1093
-            '5.4' => false,
1094
-            '5.5' => true,
1095
-        ),
1096
-        'intlz_get_display_name' => array(
1097
-            '5.4' => false,
1098
-            '5.5' => true,
1099
-        ),
1100
-        'intlz_get_dst_savings' => array(
1101
-            '5.4' => false,
1102
-            '5.5' => true,
1103
-        ),
1104
-        'intlz_from_date_time_zone' => array(
1105
-            '5.4' => false,
1106
-            '5.5' => true,
1107
-        ),
1108
-        'intlz_to_date_time_zone' => array(
1109
-            '5.4' => false,
1110
-            '5.5' => true,
1111
-        ),
1112
-        'intlz_get_error_code' => array(
1113
-            '5.4' => false,
1114
-            '5.5' => true,
1115
-        ),
1116
-        'intlz_get_error_message' => array(
1117
-            '5.4' => false,
1118
-            '5.5' => true,
1119
-        ),
688
+		'array_column' => array(
689
+			'5.4' => false,
690
+			'5.5' => true,
691
+		),
692
+		'boolval' => array(
693
+			'5.4' => false,
694
+			'5.5' => true,
695
+		),
696
+		'json_last_error_msg' => array(
697
+			'5.4' => false,
698
+			'5.5' => true,
699
+		),
700
+		'password_get_info' => array(
701
+			'5.4' => false,
702
+			'5.5' => true,
703
+		),
704
+		'password_hash' => array(
705
+			'5.4' => false,
706
+			'5.5' => true,
707
+		),
708
+		'password_needs_rehash' => array(
709
+			'5.4' => false,
710
+			'5.5' => true,
711
+		),
712
+		'password_verify' => array(
713
+			'5.4' => false,
714
+			'5.5' => true,
715
+		),
716
+		'hash_pbkdf2' => array(
717
+			'5.4' => false,
718
+			'5.5' => true,
719
+		),
720
+		'openssl_pbkdf2' => array(
721
+			'5.4' => false,
722
+			'5.5' => true,
723
+		),
724
+		'curl_escape' => array(
725
+			'5.4' => false,
726
+			'5.5' => true,
727
+		),
728
+		'curl_file_create' => array(
729
+			'5.4' => false,
730
+			'5.5' => true,
731
+		),
732
+		'curl_multi_setopt' => array(
733
+			'5.4' => false,
734
+			'5.5' => true,
735
+		),
736
+		'curl_multi_strerror' => array(
737
+			'5.4' => false,
738
+			'5.5' => true,
739
+		),
740
+		'curl_pause' => array(
741
+			'5.4' => false,
742
+			'5.5' => true,
743
+		),
744
+		'curl_reset' => array(
745
+			'5.4' => false,
746
+			'5.5' => true,
747
+		),
748
+		'curl_share_close' => array(
749
+			'5.4' => false,
750
+			'5.5' => true,
751
+		),
752
+		'curl_share_init' => array(
753
+			'5.4' => false,
754
+			'5.5' => true,
755
+		),
756
+		'curl_share_setopt' => array(
757
+			'5.4' => false,
758
+			'5.5' => true,
759
+		),
760
+		'curl_strerror' => array(
761
+			'5.4' => false,
762
+			'5.5' => true,
763
+		),
764
+		'curl_unescape' => array(
765
+			'5.4' => false,
766
+			'5.5' => true,
767
+		),
768
+		'imageaffinematrixconcat' => array(
769
+			'5.4' => false,
770
+			'5.5' => true,
771
+		),
772
+		'imageaffinematrixget' => array(
773
+			'5.4' => false,
774
+			'5.5' => true,
775
+		),
776
+		'imagecrop' => array(
777
+			'5.4' => false,
778
+			'5.5' => true,
779
+		),
780
+		'imagecropauto' => array(
781
+			'5.4' => false,
782
+			'5.5' => true,
783
+		),
784
+		'imageflip' => array(
785
+			'5.4' => false,
786
+			'5.5' => true,
787
+		),
788
+		'imagepalettetotruecolor' => array(
789
+			'5.4' => false,
790
+			'5.5' => true,
791
+		),
792
+		'imagescale' => array(
793
+			'5.4' => false,
794
+			'5.5' => true,
795
+		),
796
+		'mysqli_begin_transaction' => array(
797
+			'5.4' => false,
798
+			'5.5' => true,
799
+		),
800
+		'mysqli_release_savepoint' => array(
801
+			'5.4' => false,
802
+			'5.5' => true,
803
+		),
804
+		'mysqli_savepoint' => array(
805
+			'5.4' => false,
806
+			'5.5' => true,
807
+		),
808
+		'pg_escape_literal' => array(
809
+			'5.4' => false,
810
+			'5.5' => true,
811
+		),
812
+		'pg_escape_identifier' => array(
813
+			'5.4' => false,
814
+			'5.5' => true,
815
+		),
816
+		'socket_sendmsg' => array(
817
+			'5.4' => false,
818
+			'5.5' => true,
819
+		),
820
+		'socket_recvmsg' => array(
821
+			'5.4' => false,
822
+			'5.5' => true,
823
+		),
824
+		'socket_cmsg_space' => array(
825
+			'5.4' => false,
826
+			'5.5' => true,
827
+		),
828
+		'cli_get_process_title' => array(
829
+			'5.4' => false,
830
+			'5.5' => true,
831
+		),
832
+		'cli_set_process_title' => array(
833
+			'5.4' => false,
834
+			'5.5' => true,
835
+		),
836
+		'datefmt_format_object' => array(
837
+			'5.4' => false,
838
+			'5.5' => true,
839
+		),
840
+		'datefmt_get_calendar_object' => array(
841
+			'5.4' => false,
842
+			'5.5' => true,
843
+		),
844
+		'datefmt_get_timezone' => array(
845
+			'5.4' => false,
846
+			'5.5' => true,
847
+		),
848
+		'datefmt_set_timezone' => array(
849
+			'5.4' => false,
850
+			'5.5' => true,
851
+		),
852
+		'datefmt_get_calendar_object' => array(
853
+			'5.4' => false,
854
+			'5.5' => true,
855
+		),
856
+		'intlcal_create_instance' => array(
857
+			'5.4' => false,
858
+			'5.5' => true,
859
+		),
860
+		'intlcal_get_keyword_values_for_locale' => array(
861
+			'5.4' => false,
862
+			'5.5' => true,
863
+		),
864
+		'intlcal_get_now' => array(
865
+			'5.4' => false,
866
+			'5.5' => true,
867
+		),
868
+		'intlcal_get_available_locales' => array(
869
+			'5.4' => false,
870
+			'5.5' => true,
871
+		),
872
+		'intlcal_get' => array(
873
+			'5.4' => false,
874
+			'5.5' => true,
875
+		),
876
+		'intlcal_get_time' => array(
877
+			'5.4' => false,
878
+			'5.5' => true,
879
+		),
880
+		'intlcal_set_time' => array(
881
+			'5.4' => false,
882
+			'5.5' => true,
883
+		),
884
+		'intlcal_add' => array(
885
+			'5.4' => false,
886
+			'5.5' => true,
887
+		),
888
+		'intlcal_set_time_zone' => array(
889
+			'5.4' => false,
890
+			'5.5' => true,
891
+		),
892
+		'intlcal_after' => array(
893
+			'5.4' => false,
894
+			'5.5' => true,
895
+		),
896
+		'intlcal_before' => array(
897
+			'5.4' => false,
898
+			'5.5' => true,
899
+		),
900
+		'intlcal_set' => array(
901
+			'5.4' => false,
902
+			'5.5' => true,
903
+		),
904
+		'intlcal_roll' => array(
905
+			'5.4' => false,
906
+			'5.5' => true,
907
+		),
908
+		'intlcal_clear' => array(
909
+			'5.4' => false,
910
+			'5.5' => true,
911
+		),
912
+		'intlcal_field_difference' => array(
913
+			'5.4' => false,
914
+			'5.5' => true,
915
+		),
916
+		'intlcal_get_actual_maximum' => array(
917
+			'5.4' => false,
918
+			'5.5' => true,
919
+		),
920
+		'intlcal_get_actual_minumum' => array(
921
+			'5.4' => false,
922
+			'5.5' => true,
923
+		),
924
+		'intlcal_get_day_of_week_type' => array(
925
+			'5.4' => false,
926
+			'5.5' => true,
927
+		),
928
+		'intlcal_get_first_day_of_week' => array(
929
+			'5.4' => false,
930
+			'5.5' => true,
931
+		),
932
+		'intlcal_get_greatest_minimum' => array(
933
+			'5.4' => false,
934
+			'5.5' => true,
935
+		),
936
+		'intlcal_get_least_maximum' => array(
937
+			'5.4' => false,
938
+			'5.5' => true,
939
+		),
940
+		'intlcal_get_locale' => array(
941
+			'5.4' => false,
942
+			'5.5' => true,
943
+		),
944
+		'intlcal_get_maximum' => array(
945
+			'5.4' => false,
946
+			'5.5' => true,
947
+		),
948
+		'intlcal_get_minimal_days_in_first_week' => array(
949
+			'5.4' => false,
950
+			'5.5' => true,
951
+		),
952
+		'intlcal_get_minimum' => array(
953
+			'5.4' => false,
954
+			'5.5' => true,
955
+		),
956
+		'intlcal_get_time_zone' => array(
957
+			'5.4' => false,
958
+			'5.5' => true,
959
+		),
960
+		'intlcal_get_type' => array(
961
+			'5.4' => false,
962
+			'5.5' => true,
963
+		),
964
+		'intlcal_get_weekend_transition' => array(
965
+			'5.4' => false,
966
+			'5.5' => true,
967
+		),
968
+		'intlcal_in_daylight_time' => array(
969
+			'5.4' => false,
970
+			'5.5' => true,
971
+		),
972
+		'intlcal_is_equivalent_to' => array(
973
+			'5.4' => false,
974
+			'5.5' => true,
975
+		),
976
+		'intlcal_is_lenient' => array(
977
+			'5.4' => false,
978
+			'5.5' => true,
979
+		),
980
+		'intlcal_equals' => array(
981
+			'5.4' => false,
982
+			'5.5' => true,
983
+		),
984
+		'intlcal_get_repeated_wall_time_option' => array(
985
+			'5.4' => false,
986
+			'5.5' => true,
987
+		),
988
+		'intlcal_get_skipped_wall_time_option' => array(
989
+			'5.4' => false,
990
+			'5.5' => true,
991
+		),
992
+		'intlcal_set_repeated_wall_time_option' => array(
993
+			'5.4' => false,
994
+			'5.5' => true,
995
+		),
996
+		'intlcal_set_skipped_wall_time_option' => array(
997
+			'5.4' => false,
998
+			'5.5' => true,
999
+		),
1000
+		'intlcal_from_date_time' => array(
1001
+			'5.4' => false,
1002
+			'5.5' => true,
1003
+		),
1004
+		'intlcal_to_date_time' => array(
1005
+			'5.4' => false,
1006
+			'5.5' => true,
1007
+		),
1008
+		'intlcal_get_error_code' => array(
1009
+			'5.4' => false,
1010
+			'5.5' => true,
1011
+		),
1012
+		'intlcal_get_error_message' => array(
1013
+			'5.4' => false,
1014
+			'5.5' => true,
1015
+		),
1016
+		'intlgregcal_create_instance' => array(
1017
+			'5.4' => false,
1018
+			'5.5' => true,
1019
+		),
1020
+		'intlgregcal_set_gregorian_change' => array(
1021
+			'5.4' => false,
1022
+			'5.5' => true,
1023
+		),
1024
+		'intlgregcal_get_gregorian_change' => array(
1025
+			'5.4' => false,
1026
+			'5.5' => true,
1027
+		),
1028
+		'intlgregcal_is_leap_year' => array(
1029
+			'5.4' => false,
1030
+			'5.5' => true,
1031
+		),
1032
+		'intlz_create_time_zone' => array(
1033
+			'5.4' => false,
1034
+			'5.5' => true,
1035
+		),
1036
+		'intlz_create_default' => array(
1037
+			'5.4' => false,
1038
+			'5.5' => true,
1039
+		),
1040
+		'intlz_get_id' => array(
1041
+			'5.4' => false,
1042
+			'5.5' => true,
1043
+		),
1044
+		'intlz_get_gmt' => array(
1045
+			'5.4' => false,
1046
+			'5.5' => true,
1047
+		),
1048
+		'intlz_get_unknown' => array(
1049
+			'5.4' => false,
1050
+			'5.5' => true,
1051
+		),
1052
+		'intlz_create_enumeration' => array(
1053
+			'5.4' => false,
1054
+			'5.5' => true,
1055
+		),
1056
+		'intlz_count_equivalent_ids' => array(
1057
+			'5.4' => false,
1058
+			'5.5' => true,
1059
+		),
1060
+		'intlz_create_time_zone_id_enumeration' => array(
1061
+			'5.4' => false,
1062
+			'5.5' => true,
1063
+		),
1064
+		'intlz_get_canonical_id' => array(
1065
+			'5.4' => false,
1066
+			'5.5' => true,
1067
+		),
1068
+		'intlz_get_region' => array(
1069
+			'5.4' => false,
1070
+			'5.5' => true,
1071
+		),
1072
+		'intlz_get_tz_data_version' => array(
1073
+			'5.4' => false,
1074
+			'5.5' => true,
1075
+		),
1076
+		'intlz_get_equivalent_id' => array(
1077
+			'5.4' => false,
1078
+			'5.5' => true,
1079
+		),
1080
+		'intlz_use_daylight_time' => array(
1081
+			'5.4' => false,
1082
+			'5.5' => true,
1083
+		),
1084
+		'intlz_get_offset' => array(
1085
+			'5.4' => false,
1086
+			'5.5' => true,
1087
+		),
1088
+		'intlz_get_raw_offset' => array(
1089
+			'5.4' => false,
1090
+			'5.5' => true,
1091
+		),
1092
+		'intlz_has_same_rules' => array(
1093
+			'5.4' => false,
1094
+			'5.5' => true,
1095
+		),
1096
+		'intlz_get_display_name' => array(
1097
+			'5.4' => false,
1098
+			'5.5' => true,
1099
+		),
1100
+		'intlz_get_dst_savings' => array(
1101
+			'5.4' => false,
1102
+			'5.5' => true,
1103
+		),
1104
+		'intlz_from_date_time_zone' => array(
1105
+			'5.4' => false,
1106
+			'5.5' => true,
1107
+		),
1108
+		'intlz_to_date_time_zone' => array(
1109
+			'5.4' => false,
1110
+			'5.5' => true,
1111
+		),
1112
+		'intlz_get_error_code' => array(
1113
+			'5.4' => false,
1114
+			'5.5' => true,
1115
+		),
1116
+		'intlz_get_error_message' => array(
1117
+			'5.4' => false,
1118
+			'5.5' => true,
1119
+		),
1120 1120
 
1121
-        'gmp_root' => array(
1122
-            '5.5' => false,
1123
-            '5.6' => true,
1124
-        ),
1125
-        'gmp_rootrem' => array(
1126
-            '5.5' => false,
1127
-            '5.6' => true,
1128
-        ),
1129
-        'hash_equals' => array(
1130
-            '5.5' => false,
1131
-            '5.6' => true,
1132
-        ),
1133
-        'ldap_escape' => array(
1134
-            '5.5' => false,
1135
-            '5.6' => true,
1136
-        ),
1137
-        'ldap_modify_batch' => array(
1138
-            '5.4.25' => false,
1139
-            '5.5.9'  => false,
1140
-            '5.4.26' => true,
1141
-            '5.5.10' => true,
1142
-            '5.6.0'  => true,
1143
-        ),
1144
-        'mysqli_get_links_stats' => array(
1145
-            '5.5' => false,
1146
-            '5.6' => true,
1147
-        ),
1148
-        'openssl_get_cert_locations' => array(
1149
-            '5.5' => false,
1150
-            '5.6' => true,
1151
-        ),
1152
-        'openssl_x509_fingerprint' => array(
1153
-            '5.5' => false,
1154
-            '5.6' => true,
1155
-        ),
1156
-        'openssl_spki_new' => array(
1157
-            '5.5' => false,
1158
-            '5.6' => true,
1159
-        ),
1160
-        'openssl_spki_verify' => array(
1161
-            '5.5' => false,
1162
-            '5.6' => true,
1163
-        ),
1164
-        'openssl_spki_export_challenge' => array(
1165
-            '5.5' => false,
1166
-            '5.6' => true,
1167
-        ),
1168
-        'openssl_spki_export' => array(
1169
-            '5.5' => false,
1170
-            '5.6' => true,
1171
-        ),
1172
-        'pg_connect_poll' => array(
1173
-            '5.5' => false,
1174
-            '5.6' => true,
1175
-        ),
1176
-        'pg_consume_input' => array(
1177
-            '5.5' => false,
1178
-            '5.6' => true,
1179
-        ),
1180
-        'pg_flush' => array(
1181
-            '5.5' => false,
1182
-            '5.6' => true,
1183
-        ),
1184
-        'pg_lo_truncate' => array(
1185
-            '5.5' => false,
1186
-            '5.6' => true,
1187
-        ),
1188
-        'pg_socket' => array(
1189
-            '5.5' => false,
1190
-            '5.6' => true,
1191
-        ),
1192
-        'session_abort' => array(
1193
-            '5.5' => false,
1194
-            '5.6' => true,
1195
-        ),
1196
-        'session_reset' => array(
1197
-            '5.5' => false,
1198
-            '5.6' => true,
1199
-        ),
1121
+		'gmp_root' => array(
1122
+			'5.5' => false,
1123
+			'5.6' => true,
1124
+		),
1125
+		'gmp_rootrem' => array(
1126
+			'5.5' => false,
1127
+			'5.6' => true,
1128
+		),
1129
+		'hash_equals' => array(
1130
+			'5.5' => false,
1131
+			'5.6' => true,
1132
+		),
1133
+		'ldap_escape' => array(
1134
+			'5.5' => false,
1135
+			'5.6' => true,
1136
+		),
1137
+		'ldap_modify_batch' => array(
1138
+			'5.4.25' => false,
1139
+			'5.5.9'  => false,
1140
+			'5.4.26' => true,
1141
+			'5.5.10' => true,
1142
+			'5.6.0'  => true,
1143
+		),
1144
+		'mysqli_get_links_stats' => array(
1145
+			'5.5' => false,
1146
+			'5.6' => true,
1147
+		),
1148
+		'openssl_get_cert_locations' => array(
1149
+			'5.5' => false,
1150
+			'5.6' => true,
1151
+		),
1152
+		'openssl_x509_fingerprint' => array(
1153
+			'5.5' => false,
1154
+			'5.6' => true,
1155
+		),
1156
+		'openssl_spki_new' => array(
1157
+			'5.5' => false,
1158
+			'5.6' => true,
1159
+		),
1160
+		'openssl_spki_verify' => array(
1161
+			'5.5' => false,
1162
+			'5.6' => true,
1163
+		),
1164
+		'openssl_spki_export_challenge' => array(
1165
+			'5.5' => false,
1166
+			'5.6' => true,
1167
+		),
1168
+		'openssl_spki_export' => array(
1169
+			'5.5' => false,
1170
+			'5.6' => true,
1171
+		),
1172
+		'pg_connect_poll' => array(
1173
+			'5.5' => false,
1174
+			'5.6' => true,
1175
+		),
1176
+		'pg_consume_input' => array(
1177
+			'5.5' => false,
1178
+			'5.6' => true,
1179
+		),
1180
+		'pg_flush' => array(
1181
+			'5.5' => false,
1182
+			'5.6' => true,
1183
+		),
1184
+		'pg_lo_truncate' => array(
1185
+			'5.5' => false,
1186
+			'5.6' => true,
1187
+		),
1188
+		'pg_socket' => array(
1189
+			'5.5' => false,
1190
+			'5.6' => true,
1191
+		),
1192
+		'session_abort' => array(
1193
+			'5.5' => false,
1194
+			'5.6' => true,
1195
+		),
1196
+		'session_reset' => array(
1197
+			'5.5' => false,
1198
+			'5.6' => true,
1199
+		),
1200 1200
 
1201
-        'random_bytes' => array(
1202
-            '5.6' => false,
1203
-            '7.0' => true,
1204
-        ),
1205
-        'random_int' => array(
1206
-            '5.6' => false,
1207
-            '7.0' => true,
1208
-        ),
1209
-        'error_clear_last' => array(
1210
-            '5.6' => false,
1211
-            '7.0' => true,
1212
-        ),
1213
-        'gmp_random_seed' => array(
1214
-            '5.6' => false,
1215
-            '7.0' => true,
1216
-        ),
1217
-        'intdiv' => array(
1218
-            '5.6' => false,
1219
-            '7.0' => true,
1220
-        ),
1221
-        'preg_replace_callback_array' => array(
1222
-            '5.6' => false,
1223
-            '7.0' => true,
1224
-        ),
1225
-        'gc_mem_caches' => array(
1226
-            '5.6' => false,
1227
-            '7.0' => true,
1228
-        ),
1229
-        'get_resources' => array(
1230
-            '5.6' => false,
1231
-            '7.0' => true,
1232
-        ),
1233
-        'posix_setrlimit' => array(
1234
-            '5.6' => false,
1235
-            '7.0' => true,
1236
-        ),
1237
-        'inflate_add' => array(
1238
-            '5.6' => false,
1239
-            '7.0' => true,
1240
-        ),
1241
-        'deflate_add' => array(
1242
-            '5.6' => false,
1243
-            '7.0' => true,
1244
-        ),
1245
-        'inflate_init' => array(
1246
-            '5.6' => false,
1247
-            '7.0' => true,
1248
-        ),
1249
-        'deflate_init' => array(
1250
-            '5.6' => false,
1251
-            '7.0' => true,
1252
-        ),
1201
+		'random_bytes' => array(
1202
+			'5.6' => false,
1203
+			'7.0' => true,
1204
+		),
1205
+		'random_int' => array(
1206
+			'5.6' => false,
1207
+			'7.0' => true,
1208
+		),
1209
+		'error_clear_last' => array(
1210
+			'5.6' => false,
1211
+			'7.0' => true,
1212
+		),
1213
+		'gmp_random_seed' => array(
1214
+			'5.6' => false,
1215
+			'7.0' => true,
1216
+		),
1217
+		'intdiv' => array(
1218
+			'5.6' => false,
1219
+			'7.0' => true,
1220
+		),
1221
+		'preg_replace_callback_array' => array(
1222
+			'5.6' => false,
1223
+			'7.0' => true,
1224
+		),
1225
+		'gc_mem_caches' => array(
1226
+			'5.6' => false,
1227
+			'7.0' => true,
1228
+		),
1229
+		'get_resources' => array(
1230
+			'5.6' => false,
1231
+			'7.0' => true,
1232
+		),
1233
+		'posix_setrlimit' => array(
1234
+			'5.6' => false,
1235
+			'7.0' => true,
1236
+		),
1237
+		'inflate_add' => array(
1238
+			'5.6' => false,
1239
+			'7.0' => true,
1240
+		),
1241
+		'deflate_add' => array(
1242
+			'5.6' => false,
1243
+			'7.0' => true,
1244
+		),
1245
+		'inflate_init' => array(
1246
+			'5.6' => false,
1247
+			'7.0' => true,
1248
+		),
1249
+		'deflate_init' => array(
1250
+			'5.6' => false,
1251
+			'7.0' => true,
1252
+		),
1253 1253
 
1254
-        'socket_export_stream' => array(
1255
-            '7.0.6' => false,
1256
-            '7.0.7' => true,
1257
-        ),
1254
+		'socket_export_stream' => array(
1255
+			'7.0.6' => false,
1256
+			'7.0.7' => true,
1257
+		),
1258 1258
 
1259
-        'curl_multi_errno' => array(
1260
-            '7.0' => false,
1261
-            '7.1' => true,
1262
-        ),
1263
-        'curl_share_errno' => array(
1264
-            '7.0' => false,
1265
-            '7.1' => true,
1266
-        ),
1267
-        'curl_share_strerror' => array(
1268
-            '7.0' => false,
1269
-            '7.1' => true,
1270
-        ),
1271
-        'is_iterable' => array(
1272
-            '7.0' => false,
1273
-            '7.1' => true,
1274
-        ),
1275
-        'pcntl_async_signals' => array(
1276
-            '7.0' => false,
1277
-            '7.1' => true,
1278
-        ),
1279
-        'pcntl_signal_get_handler' => array(
1280
-            '7.0' => false,
1281
-            '7.1' => true,
1282
-        ),
1283
-        'session_create_id' => array(
1284
-            '7.0' => false,
1285
-            '7.1' => true,
1286
-        ),
1287
-        'session_gc' => array(
1288
-            '7.0' => false,
1289
-            '7.1' => true,
1290
-        ),
1291
-        'sapi_windows_cp_set' => array(
1292
-            '7.0' => false,
1293
-            '7.1' => true,
1294
-        ),
1295
-        'sapi_windows_cp_get' => array(
1296
-            '7.0' => false,
1297
-            '7.1' => true,
1298
-        ),
1299
-        'sapi_windows_cp_is_utf8' => array(
1300
-            '7.0' => false,
1301
-            '7.1' => true,
1302
-        ),
1303
-        'sapi_windows_cp_conv' => array(
1304
-            '7.0' => false,
1305
-            '7.1' => true,
1306
-        ),
1259
+		'curl_multi_errno' => array(
1260
+			'7.0' => false,
1261
+			'7.1' => true,
1262
+		),
1263
+		'curl_share_errno' => array(
1264
+			'7.0' => false,
1265
+			'7.1' => true,
1266
+		),
1267
+		'curl_share_strerror' => array(
1268
+			'7.0' => false,
1269
+			'7.1' => true,
1270
+		),
1271
+		'is_iterable' => array(
1272
+			'7.0' => false,
1273
+			'7.1' => true,
1274
+		),
1275
+		'pcntl_async_signals' => array(
1276
+			'7.0' => false,
1277
+			'7.1' => true,
1278
+		),
1279
+		'pcntl_signal_get_handler' => array(
1280
+			'7.0' => false,
1281
+			'7.1' => true,
1282
+		),
1283
+		'session_create_id' => array(
1284
+			'7.0' => false,
1285
+			'7.1' => true,
1286
+		),
1287
+		'session_gc' => array(
1288
+			'7.0' => false,
1289
+			'7.1' => true,
1290
+		),
1291
+		'sapi_windows_cp_set' => array(
1292
+			'7.0' => false,
1293
+			'7.1' => true,
1294
+		),
1295
+		'sapi_windows_cp_get' => array(
1296
+			'7.0' => false,
1297
+			'7.1' => true,
1298
+		),
1299
+		'sapi_windows_cp_is_utf8' => array(
1300
+			'7.0' => false,
1301
+			'7.1' => true,
1302
+		),
1303
+		'sapi_windows_cp_conv' => array(
1304
+			'7.0' => false,
1305
+			'7.1' => true,
1306
+		),
1307 1307
 
1308
-        'hash_hkdf' => array(
1309
-            '7.1.1' => false,
1310
-            '7.1.2' => true,
1311
-        ),
1312
-        'oci_register_taf_callback' => array(
1313
-            '7.1.6' => false,
1314
-            '7.1.7' => true,
1315
-        ),
1316
-        'oci_unregister_taf_callback' => array(
1317
-            '7.1.8' => false,
1318
-            '7.1.9' => true,
1319
-        ),
1308
+		'hash_hkdf' => array(
1309
+			'7.1.1' => false,
1310
+			'7.1.2' => true,
1311
+		),
1312
+		'oci_register_taf_callback' => array(
1313
+			'7.1.6' => false,
1314
+			'7.1.7' => true,
1315
+		),
1316
+		'oci_unregister_taf_callback' => array(
1317
+			'7.1.8' => false,
1318
+			'7.1.9' => true,
1319
+		),
1320 1320
 
1321
-        'stream_isatty' => array(
1322
-            '7.1' => false,
1323
-            '7.2' => true,
1324
-        ),
1325
-        'sapi_windows_vt100_support' => array(
1326
-            '7.1' => false,
1327
-            '7.2' => true,
1328
-        ),
1329
-        'ftp_append' => array(
1330
-            '7.1' => false,
1331
-            '7.2' => true,
1332
-        ),
1333
-        'hash_hmac_algos' => array(
1334
-            '7.1' => false,
1335
-            '7.2' => true,
1336
-        ),
1337
-        'imagebmp' => array(
1338
-            '7.1' => false,
1339
-            '7.2' => true,
1340
-        ),
1341
-        'imagecreatefrombmp' => array(
1342
-            '7.1' => false,
1343
-            '7.2' => true,
1344
-        ),
1345
-        'imagegetclip' => array(
1346
-            '7.1' => false,
1347
-            '7.2' => true,
1348
-        ),
1349
-        'imageopenpolygon' => array(
1350
-            '7.1' => false,
1351
-            '7.2' => true,
1352
-        ),
1353
-        'imageresolution' => array(
1354
-            '7.1' => false,
1355
-            '7.2' => true,
1356
-        ),
1357
-        'imagesetclip' => array(
1358
-            '7.1' => false,
1359
-            '7.2' => true,
1360
-        ),
1361
-        'ldap_exop' => array(
1362
-            '7.1' => false,
1363
-            '7.2' => true,
1364
-        ),
1365
-        'ldap_exop_passwd' => array(
1366
-            '7.1' => false,
1367
-            '7.2' => true,
1368
-        ),
1369
-        'ldap_exop_whoami' => array(
1370
-            '7.1' => false,
1371
-            '7.2' => true,
1372
-        ),
1373
-        'ldap_parse_exop' => array(
1374
-            '7.1' => false,
1375
-            '7.2' => true,
1376
-        ),
1377
-        'mb_chr' => array(
1378
-            '7.1' => false,
1379
-            '7.2' => true,
1380
-        ),
1381
-        'mb_ord' => array(
1382
-            '7.1' => false,
1383
-            '7.2' => true,
1384
-        ),
1385
-        'mb_scrub' => array(
1386
-            '7.1' => false,
1387
-            '7.2' => true,
1388
-        ),
1389
-        'socket_addrinfo_lookup' => array(
1390
-            '7.1' => false,
1391
-            '7.2' => true,
1392
-        ),
1393
-        'socket_addrinfo_connect' => array(
1394
-            '7.1' => false,
1395
-            '7.2' => true,
1396
-        ),
1397
-        'socket_addrinfo_bind' => array(
1398
-            '7.1' => false,
1399
-            '7.2' => true,
1400
-        ),
1401
-        'socket_addrinfo_explain' => array(
1402
-            '7.1' => false,
1403
-            '7.2' => true,
1404
-        ),
1405
-        'spl_object_id' => array(
1406
-            '7.1' => false,
1407
-            '7.2' => true,
1408
-        ),
1409
-        'sodium_add' => array(
1410
-            '7.1' => false,
1411
-            '7.2' => true,
1412
-        ),
1413
-        'sodium_base642bin' => array(
1414
-            '7.1' => false,
1415
-            '7.2' => true,
1416
-        ),
1417
-        'sodium_bin2base64' => array(
1418
-            '7.1' => false,
1419
-            '7.2' => true,
1420
-        ),
1421
-        'sodium_bin2hex' => array(
1422
-            '7.1' => false,
1423
-            '7.2' => true,
1424
-        ),
1425
-        'sodium_compare' => array(
1426
-            '7.1' => false,
1427
-            '7.2' => true,
1428
-        ),
1429
-        'sodium_crypto_aead_aes256gcm_decrypt' => array(
1430
-            '7.1' => false,
1431
-            '7.2' => true,
1432
-        ),
1433
-        'sodium_crypto_aead_aes256gcm_encrypt' => array(
1434
-            '7.1' => false,
1435
-            '7.2' => true,
1436
-        ),
1437
-        'sodium_crypto_aead_aes256gcm_is_available' => array(
1438
-            '7.1' => false,
1439
-            '7.2' => true,
1440
-        ),
1441
-        'sodium_crypto_aead_aes256gcm_keygen' => array(
1442
-            '7.1' => false,
1443
-            '7.2' => true,
1444
-        ),
1445
-        'sodium_crypto_aead_chacha20poly1305_decrypt' => array(
1446
-            '7.1' => false,
1447
-            '7.2' => true,
1448
-        ),
1449
-        'sodium_crypto_aead_chacha20poly1305_encrypt' => array(
1450
-            '7.1' => false,
1451
-            '7.2' => true,
1452
-        ),
1453
-        'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => array(
1454
-            '7.1' => false,
1455
-            '7.2' => true,
1456
-        ),
1457
-        'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => array(
1458
-            '7.1' => false,
1459
-            '7.2' => true,
1460
-        ),
1461
-        'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => array(
1462
-            '7.1' => false,
1463
-            '7.2' => true,
1464
-        ),
1465
-        'sodium_crypto_aead_chacha20poly1305_keygen' => array(
1466
-            '7.1' => false,
1467
-            '7.2' => true,
1468
-        ),
1469
-        'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => array(
1470
-            '7.1' => false,
1471
-            '7.2' => true,
1472
-        ),
1473
-        'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => array(
1474
-            '7.1' => false,
1475
-            '7.2' => true,
1476
-        ),
1477
-        'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => array(
1478
-            '7.1' => false,
1479
-            '7.2' => true,
1480
-        ),
1481
-        'sodium_crypto_auth_keygen' => array(
1482
-            '7.1' => false,
1483
-            '7.2' => true,
1484
-        ),
1485
-        'sodium_crypto_auth_verify' => array(
1486
-            '7.1' => false,
1487
-            '7.2' => true,
1488
-        ),
1489
-        'sodium_crypto_auth' => array(
1490
-            '7.1' => false,
1491
-            '7.2' => true,
1492
-        ),
1493
-        'sodium_crypto_box_keypair_from_secretkey_and_publickey' => array(
1494
-            '7.1' => false,
1495
-            '7.2' => true,
1496
-        ),
1497
-        'sodium_crypto_box_keypair' => array(
1498
-            '7.1' => false,
1499
-            '7.2' => true,
1500
-        ),
1501
-        'sodium_crypto_box_open' => array(
1502
-            '7.1' => false,
1503
-            '7.2' => true,
1504
-        ),
1505
-        'sodium_crypto_box_publickey_from_secretkey' => array(
1506
-            '7.1' => false,
1507
-            '7.2' => true,
1508
-        ),
1509
-        'sodium_crypto_box_publickey' => array(
1510
-            '7.1' => false,
1511
-            '7.2' => true,
1512
-        ),
1513
-        'sodium_crypto_box_seal_open' => array(
1514
-            '7.1' => false,
1515
-            '7.2' => true,
1516
-        ),
1517
-        'sodium_crypto_box_seal' => array(
1518
-            '7.1' => false,
1519
-            '7.2' => true,
1520
-        ),
1521
-        'sodium_crypto_box_secretkey' => array(
1522
-            '7.1' => false,
1523
-            '7.2' => true,
1524
-        ),
1525
-        'sodium_crypto_box_seed_keypair' => array(
1526
-            '7.1' => false,
1527
-            '7.2' => true,
1528
-        ),
1529
-        'sodium_crypto_box' => array(
1530
-            '7.1' => false,
1531
-            '7.2' => true,
1532
-        ),
1533
-        'sodium_crypto_generichash_final' => array(
1534
-            '7.1' => false,
1535
-            '7.2' => true,
1536
-        ),
1537
-        'sodium_crypto_generichash_init' => array(
1538
-            '7.1' => false,
1539
-            '7.2' => true,
1540
-        ),
1541
-        'sodium_crypto_generichash_keygen' => array(
1542
-            '7.1' => false,
1543
-            '7.2' => true,
1544
-        ),
1545
-        'sodium_crypto_generichash_update' => array(
1546
-            '7.1' => false,
1547
-            '7.2' => true,
1548
-        ),
1549
-        'sodium_crypto_generichash' => array(
1550
-            '7.1' => false,
1551
-            '7.2' => true,
1552
-        ),
1553
-        'sodium_crypto_kdf_derive_from_key' => array(
1554
-            '7.1' => false,
1555
-            '7.2' => true,
1556
-        ),
1557
-        'sodium_crypto_kdf_keygen' => array(
1558
-            '7.1' => false,
1559
-            '7.2' => true,
1560
-        ),
1561
-        'sodium_crypto_kx_client_session_keys' => array(
1562
-            '7.1' => false,
1563
-            '7.2' => true,
1564
-        ),
1565
-        'sodium_crypto_kx_keypair' => array(
1566
-            '7.1' => false,
1567
-            '7.2' => true,
1568
-        ),
1569
-        'sodium_crypto_kx_publickey' => array(
1570
-            '7.1' => false,
1571
-            '7.2' => true,
1572
-        ),
1573
-        'sodium_crypto_kx_secretkey' => array(
1574
-            '7.1' => false,
1575
-            '7.2' => true,
1576
-        ),
1577
-        'sodium_crypto_kx_seed_keypair' => array(
1578
-            '7.1' => false,
1579
-            '7.2' => true,
1580
-        ),
1581
-        'sodium_crypto_kx_server_session_keys' => array(
1582
-            '7.1' => false,
1583
-            '7.2' => true,
1584
-        ),
1585
-        'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => array(
1586
-            '7.1' => false,
1587
-            '7.2' => true,
1588
-        ),
1589
-        'sodium_crypto_pwhash_scryptsalsa208sha256_str' => array(
1590
-            '7.1' => false,
1591
-            '7.2' => true,
1592
-        ),
1593
-        'sodium_crypto_pwhash_scryptsalsa208sha256' => array(
1594
-            '7.1' => false,
1595
-            '7.2' => true,
1596
-        ),
1597
-        'sodium_crypto_pwhash_str_needs_rehash' => array(
1598
-            '7.1' => false,
1599
-            '7.2' => true,
1600
-        ),
1601
-        'sodium_crypto_pwhash_str_verify' => array(
1602
-            '7.1' => false,
1603
-            '7.2' => true,
1604
-        ),
1605
-        'sodium_crypto_pwhash_str' => array(
1606
-            '7.1' => false,
1607
-            '7.2' => true,
1608
-        ),
1609
-        'sodium_crypto_pwhash' => array(
1610
-            '7.1' => false,
1611
-            '7.2' => true,
1612
-        ),
1613
-        'sodium_crypto_scalarmult_base' => array(
1614
-            '7.1' => false,
1615
-            '7.2' => true,
1616
-        ),
1617
-        'sodium_crypto_scalarmult' => array(
1618
-            '7.1' => false,
1619
-            '7.2' => true,
1620
-        ),
1621
-        'sodium_crypto_secretbox_keygen' => array(
1622
-            '7.1' => false,
1623
-            '7.2' => true,
1624
-        ),
1625
-        'sodium_crypto_secretbox_open' => array(
1626
-            '7.1' => false,
1627
-            '7.2' => true,
1628
-        ),
1629
-        'sodium_crypto_secretbox' => array(
1630
-            '7.1' => false,
1631
-            '7.2' => true,
1632
-        ),
1633
-        'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => array(
1634
-            '7.1' => false,
1635
-            '7.2' => true,
1636
-        ),
1637
-        'sodium_crypto_secretstream_xchacha20poly1305_init_push' => array(
1638
-            '7.1' => false,
1639
-            '7.2' => true,
1640
-        ),
1641
-        'sodium_crypto_secretstream_xchacha20poly1305_keygen' => array(
1642
-            '7.1' => false,
1643
-            '7.2' => true,
1644
-        ),
1645
-        'sodium_crypto_secretstream_xchacha20poly1305_pull' => array(
1646
-            '7.1' => false,
1647
-            '7.2' => true,
1648
-        ),
1649
-        'sodium_crypto_secretstream_xchacha20poly1305_push' => array(
1650
-            '7.1' => false,
1651
-            '7.2' => true,
1652
-        ),
1653
-        'sodium_crypto_secretstream_xchacha20poly1305_rekey' => array(
1654
-            '7.1' => false,
1655
-            '7.2' => true,
1656
-        ),
1657
-        'sodium_crypto_shorthash_keygen' => array(
1658
-            '7.1' => false,
1659
-            '7.2' => true,
1660
-        ),
1661
-        'sodium_crypto_shorthash' => array(
1662
-            '7.1' => false,
1663
-            '7.2' => true,
1664
-        ),
1665
-        'sodium_crypto_sign_detached' => array(
1666
-            '7.1' => false,
1667
-            '7.2' => true,
1668
-        ),
1669
-        'sodium_crypto_sign_ed25519_pk_to_curve25519' => array(
1670
-            '7.1' => false,
1671
-            '7.2' => true,
1672
-        ),
1673
-        'sodium_crypto_sign_ed25519_sk_to_curve25519' => array(
1674
-            '7.1' => false,
1675
-            '7.2' => true,
1676
-        ),
1677
-        'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => array(
1678
-            '7.1' => false,
1679
-            '7.2' => true,
1680
-        ),
1681
-        'sodium_crypto_sign_keypair' => array(
1682
-            '7.1' => false,
1683
-            '7.2' => true,
1684
-        ),
1685
-        'sodium_crypto_sign_open' => array(
1686
-            '7.1' => false,
1687
-            '7.2' => true,
1688
-        ),
1689
-        'sodium_crypto_sign_publickey_from_secretkey' => array(
1690
-            '7.1' => false,
1691
-            '7.2' => true,
1692
-        ),
1693
-        'sodium_crypto_sign_publickey' => array(
1694
-            '7.1' => false,
1695
-            '7.2' => true,
1696
-        ),
1697
-        'sodium_crypto_sign_secretkey' => array(
1698
-            '7.1' => false,
1699
-            '7.2' => true,
1700
-        ),
1701
-        'sodium_crypto_sign_seed_keypair' => array(
1702
-            '7.1' => false,
1703
-            '7.2' => true,
1704
-        ),
1705
-        'sodium_crypto_sign_verify_detached' => array(
1706
-            '7.1' => false,
1707
-            '7.2' => true,
1708
-        ),
1709
-        'sodium_crypto_sign' => array(
1710
-            '7.1' => false,
1711
-            '7.2' => true,
1712
-        ),
1713
-        'sodium_crypto_stream_keygen' => array(
1714
-            '7.1' => false,
1715
-            '7.2' => true,
1716
-        ),
1717
-        'sodium_crypto_stream_xor' => array(
1718
-            '7.1' => false,
1719
-            '7.2' => true,
1720
-        ),
1721
-        'sodium_crypto_stream' => array(
1722
-            '7.1' => false,
1723
-            '7.2' => true,
1724
-        ),
1725
-        'sodium_hex2bin' => array(
1726
-            '7.1' => false,
1727
-            '7.2' => true,
1728
-        ),
1729
-        'sodium_increment' => array(
1730
-            '7.1' => false,
1731
-            '7.2' => true,
1732
-        ),
1733
-        'sodium_memcmp' => array(
1734
-            '7.1' => false,
1735
-            '7.2' => true,
1736
-        ),
1737
-        'sodium_memzero' => array(
1738
-            '7.1' => false,
1739
-            '7.2' => true,
1740
-        ),
1741
-        'sodium_pad' => array(
1742
-            '7.1' => false,
1743
-            '7.2' => true,
1744
-        ),
1745
-        'sodium_unpad' => array(
1746
-            '7.1' => false,
1747
-            '7.2' => true,
1748
-        ),
1749
-        // Introduced in 7.2.14 and 7.3.1 similtanously.
1750
-        'oci_set_call_timeout' => array(
1751
-            '7.2.13' => false,
1752
-            '7.2.14' => true,
1753
-        ),
1754
-        // Introduced in 7.2.14 and 7.3.1 similtanously.
1755
-        'oci_set_db_operation' => array(
1756
-            '7.2.13' => false,
1757
-            '7.2.14' => true,
1758
-        ),
1321
+		'stream_isatty' => array(
1322
+			'7.1' => false,
1323
+			'7.2' => true,
1324
+		),
1325
+		'sapi_windows_vt100_support' => array(
1326
+			'7.1' => false,
1327
+			'7.2' => true,
1328
+		),
1329
+		'ftp_append' => array(
1330
+			'7.1' => false,
1331
+			'7.2' => true,
1332
+		),
1333
+		'hash_hmac_algos' => array(
1334
+			'7.1' => false,
1335
+			'7.2' => true,
1336
+		),
1337
+		'imagebmp' => array(
1338
+			'7.1' => false,
1339
+			'7.2' => true,
1340
+		),
1341
+		'imagecreatefrombmp' => array(
1342
+			'7.1' => false,
1343
+			'7.2' => true,
1344
+		),
1345
+		'imagegetclip' => array(
1346
+			'7.1' => false,
1347
+			'7.2' => true,
1348
+		),
1349
+		'imageopenpolygon' => array(
1350
+			'7.1' => false,
1351
+			'7.2' => true,
1352
+		),
1353
+		'imageresolution' => array(
1354
+			'7.1' => false,
1355
+			'7.2' => true,
1356
+		),
1357
+		'imagesetclip' => array(
1358
+			'7.1' => false,
1359
+			'7.2' => true,
1360
+		),
1361
+		'ldap_exop' => array(
1362
+			'7.1' => false,
1363
+			'7.2' => true,
1364
+		),
1365
+		'ldap_exop_passwd' => array(
1366
+			'7.1' => false,
1367
+			'7.2' => true,
1368
+		),
1369
+		'ldap_exop_whoami' => array(
1370
+			'7.1' => false,
1371
+			'7.2' => true,
1372
+		),
1373
+		'ldap_parse_exop' => array(
1374
+			'7.1' => false,
1375
+			'7.2' => true,
1376
+		),
1377
+		'mb_chr' => array(
1378
+			'7.1' => false,
1379
+			'7.2' => true,
1380
+		),
1381
+		'mb_ord' => array(
1382
+			'7.1' => false,
1383
+			'7.2' => true,
1384
+		),
1385
+		'mb_scrub' => array(
1386
+			'7.1' => false,
1387
+			'7.2' => true,
1388
+		),
1389
+		'socket_addrinfo_lookup' => array(
1390
+			'7.1' => false,
1391
+			'7.2' => true,
1392
+		),
1393
+		'socket_addrinfo_connect' => array(
1394
+			'7.1' => false,
1395
+			'7.2' => true,
1396
+		),
1397
+		'socket_addrinfo_bind' => array(
1398
+			'7.1' => false,
1399
+			'7.2' => true,
1400
+		),
1401
+		'socket_addrinfo_explain' => array(
1402
+			'7.1' => false,
1403
+			'7.2' => true,
1404
+		),
1405
+		'spl_object_id' => array(
1406
+			'7.1' => false,
1407
+			'7.2' => true,
1408
+		),
1409
+		'sodium_add' => array(
1410
+			'7.1' => false,
1411
+			'7.2' => true,
1412
+		),
1413
+		'sodium_base642bin' => array(
1414
+			'7.1' => false,
1415
+			'7.2' => true,
1416
+		),
1417
+		'sodium_bin2base64' => array(
1418
+			'7.1' => false,
1419
+			'7.2' => true,
1420
+		),
1421
+		'sodium_bin2hex' => array(
1422
+			'7.1' => false,
1423
+			'7.2' => true,
1424
+		),
1425
+		'sodium_compare' => array(
1426
+			'7.1' => false,
1427
+			'7.2' => true,
1428
+		),
1429
+		'sodium_crypto_aead_aes256gcm_decrypt' => array(
1430
+			'7.1' => false,
1431
+			'7.2' => true,
1432
+		),
1433
+		'sodium_crypto_aead_aes256gcm_encrypt' => array(
1434
+			'7.1' => false,
1435
+			'7.2' => true,
1436
+		),
1437
+		'sodium_crypto_aead_aes256gcm_is_available' => array(
1438
+			'7.1' => false,
1439
+			'7.2' => true,
1440
+		),
1441
+		'sodium_crypto_aead_aes256gcm_keygen' => array(
1442
+			'7.1' => false,
1443
+			'7.2' => true,
1444
+		),
1445
+		'sodium_crypto_aead_chacha20poly1305_decrypt' => array(
1446
+			'7.1' => false,
1447
+			'7.2' => true,
1448
+		),
1449
+		'sodium_crypto_aead_chacha20poly1305_encrypt' => array(
1450
+			'7.1' => false,
1451
+			'7.2' => true,
1452
+		),
1453
+		'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => array(
1454
+			'7.1' => false,
1455
+			'7.2' => true,
1456
+		),
1457
+		'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => array(
1458
+			'7.1' => false,
1459
+			'7.2' => true,
1460
+		),
1461
+		'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => array(
1462
+			'7.1' => false,
1463
+			'7.2' => true,
1464
+		),
1465
+		'sodium_crypto_aead_chacha20poly1305_keygen' => array(
1466
+			'7.1' => false,
1467
+			'7.2' => true,
1468
+		),
1469
+		'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => array(
1470
+			'7.1' => false,
1471
+			'7.2' => true,
1472
+		),
1473
+		'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => array(
1474
+			'7.1' => false,
1475
+			'7.2' => true,
1476
+		),
1477
+		'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => array(
1478
+			'7.1' => false,
1479
+			'7.2' => true,
1480
+		),
1481
+		'sodium_crypto_auth_keygen' => array(
1482
+			'7.1' => false,
1483
+			'7.2' => true,
1484
+		),
1485
+		'sodium_crypto_auth_verify' => array(
1486
+			'7.1' => false,
1487
+			'7.2' => true,
1488
+		),
1489
+		'sodium_crypto_auth' => array(
1490
+			'7.1' => false,
1491
+			'7.2' => true,
1492
+		),
1493
+		'sodium_crypto_box_keypair_from_secretkey_and_publickey' => array(
1494
+			'7.1' => false,
1495
+			'7.2' => true,
1496
+		),
1497
+		'sodium_crypto_box_keypair' => array(
1498
+			'7.1' => false,
1499
+			'7.2' => true,
1500
+		),
1501
+		'sodium_crypto_box_open' => array(
1502
+			'7.1' => false,
1503
+			'7.2' => true,
1504
+		),
1505
+		'sodium_crypto_box_publickey_from_secretkey' => array(
1506
+			'7.1' => false,
1507
+			'7.2' => true,
1508
+		),
1509
+		'sodium_crypto_box_publickey' => array(
1510
+			'7.1' => false,
1511
+			'7.2' => true,
1512
+		),
1513
+		'sodium_crypto_box_seal_open' => array(
1514
+			'7.1' => false,
1515
+			'7.2' => true,
1516
+		),
1517
+		'sodium_crypto_box_seal' => array(
1518
+			'7.1' => false,
1519
+			'7.2' => true,
1520
+		),
1521
+		'sodium_crypto_box_secretkey' => array(
1522
+			'7.1' => false,
1523
+			'7.2' => true,
1524
+		),
1525
+		'sodium_crypto_box_seed_keypair' => array(
1526
+			'7.1' => false,
1527
+			'7.2' => true,
1528
+		),
1529
+		'sodium_crypto_box' => array(
1530
+			'7.1' => false,
1531
+			'7.2' => true,
1532
+		),
1533
+		'sodium_crypto_generichash_final' => array(
1534
+			'7.1' => false,
1535
+			'7.2' => true,
1536
+		),
1537
+		'sodium_crypto_generichash_init' => array(
1538
+			'7.1' => false,
1539
+			'7.2' => true,
1540
+		),
1541
+		'sodium_crypto_generichash_keygen' => array(
1542
+			'7.1' => false,
1543
+			'7.2' => true,
1544
+		),
1545
+		'sodium_crypto_generichash_update' => array(
1546
+			'7.1' => false,
1547
+			'7.2' => true,
1548
+		),
1549
+		'sodium_crypto_generichash' => array(
1550
+			'7.1' => false,
1551
+			'7.2' => true,
1552
+		),
1553
+		'sodium_crypto_kdf_derive_from_key' => array(
1554
+			'7.1' => false,
1555
+			'7.2' => true,
1556
+		),
1557
+		'sodium_crypto_kdf_keygen' => array(
1558
+			'7.1' => false,
1559
+			'7.2' => true,
1560
+		),
1561
+		'sodium_crypto_kx_client_session_keys' => array(
1562
+			'7.1' => false,
1563
+			'7.2' => true,
1564
+		),
1565
+		'sodium_crypto_kx_keypair' => array(
1566
+			'7.1' => false,
1567
+			'7.2' => true,
1568
+		),
1569
+		'sodium_crypto_kx_publickey' => array(
1570
+			'7.1' => false,
1571
+			'7.2' => true,
1572
+		),
1573
+		'sodium_crypto_kx_secretkey' => array(
1574
+			'7.1' => false,
1575
+			'7.2' => true,
1576
+		),
1577
+		'sodium_crypto_kx_seed_keypair' => array(
1578
+			'7.1' => false,
1579
+			'7.2' => true,
1580
+		),
1581
+		'sodium_crypto_kx_server_session_keys' => array(
1582
+			'7.1' => false,
1583
+			'7.2' => true,
1584
+		),
1585
+		'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => array(
1586
+			'7.1' => false,
1587
+			'7.2' => true,
1588
+		),
1589
+		'sodium_crypto_pwhash_scryptsalsa208sha256_str' => array(
1590
+			'7.1' => false,
1591
+			'7.2' => true,
1592
+		),
1593
+		'sodium_crypto_pwhash_scryptsalsa208sha256' => array(
1594
+			'7.1' => false,
1595
+			'7.2' => true,
1596
+		),
1597
+		'sodium_crypto_pwhash_str_needs_rehash' => array(
1598
+			'7.1' => false,
1599
+			'7.2' => true,
1600
+		),
1601
+		'sodium_crypto_pwhash_str_verify' => array(
1602
+			'7.1' => false,
1603
+			'7.2' => true,
1604
+		),
1605
+		'sodium_crypto_pwhash_str' => array(
1606
+			'7.1' => false,
1607
+			'7.2' => true,
1608
+		),
1609
+		'sodium_crypto_pwhash' => array(
1610
+			'7.1' => false,
1611
+			'7.2' => true,
1612
+		),
1613
+		'sodium_crypto_scalarmult_base' => array(
1614
+			'7.1' => false,
1615
+			'7.2' => true,
1616
+		),
1617
+		'sodium_crypto_scalarmult' => array(
1618
+			'7.1' => false,
1619
+			'7.2' => true,
1620
+		),
1621
+		'sodium_crypto_secretbox_keygen' => array(
1622
+			'7.1' => false,
1623
+			'7.2' => true,
1624
+		),
1625
+		'sodium_crypto_secretbox_open' => array(
1626
+			'7.1' => false,
1627
+			'7.2' => true,
1628
+		),
1629
+		'sodium_crypto_secretbox' => array(
1630
+			'7.1' => false,
1631
+			'7.2' => true,
1632
+		),
1633
+		'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => array(
1634
+			'7.1' => false,
1635
+			'7.2' => true,
1636
+		),
1637
+		'sodium_crypto_secretstream_xchacha20poly1305_init_push' => array(
1638
+			'7.1' => false,
1639
+			'7.2' => true,
1640
+		),
1641
+		'sodium_crypto_secretstream_xchacha20poly1305_keygen' => array(
1642
+			'7.1' => false,
1643
+			'7.2' => true,
1644
+		),
1645
+		'sodium_crypto_secretstream_xchacha20poly1305_pull' => array(
1646
+			'7.1' => false,
1647
+			'7.2' => true,
1648
+		),
1649
+		'sodium_crypto_secretstream_xchacha20poly1305_push' => array(
1650
+			'7.1' => false,
1651
+			'7.2' => true,
1652
+		),
1653
+		'sodium_crypto_secretstream_xchacha20poly1305_rekey' => array(
1654
+			'7.1' => false,
1655
+			'7.2' => true,
1656
+		),
1657
+		'sodium_crypto_shorthash_keygen' => array(
1658
+			'7.1' => false,
1659
+			'7.2' => true,
1660
+		),
1661
+		'sodium_crypto_shorthash' => array(
1662
+			'7.1' => false,
1663
+			'7.2' => true,
1664
+		),
1665
+		'sodium_crypto_sign_detached' => array(
1666
+			'7.1' => false,
1667
+			'7.2' => true,
1668
+		),
1669
+		'sodium_crypto_sign_ed25519_pk_to_curve25519' => array(
1670
+			'7.1' => false,
1671
+			'7.2' => true,
1672
+		),
1673
+		'sodium_crypto_sign_ed25519_sk_to_curve25519' => array(
1674
+			'7.1' => false,
1675
+			'7.2' => true,
1676
+		),
1677
+		'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => array(
1678
+			'7.1' => false,
1679
+			'7.2' => true,
1680
+		),
1681
+		'sodium_crypto_sign_keypair' => array(
1682
+			'7.1' => false,
1683
+			'7.2' => true,
1684
+		),
1685
+		'sodium_crypto_sign_open' => array(
1686
+			'7.1' => false,
1687
+			'7.2' => true,
1688
+		),
1689
+		'sodium_crypto_sign_publickey_from_secretkey' => array(
1690
+			'7.1' => false,
1691
+			'7.2' => true,
1692
+		),
1693
+		'sodium_crypto_sign_publickey' => array(
1694
+			'7.1' => false,
1695
+			'7.2' => true,
1696
+		),
1697
+		'sodium_crypto_sign_secretkey' => array(
1698
+			'7.1' => false,
1699
+			'7.2' => true,
1700
+		),
1701
+		'sodium_crypto_sign_seed_keypair' => array(
1702
+			'7.1' => false,
1703
+			'7.2' => true,
1704
+		),
1705
+		'sodium_crypto_sign_verify_detached' => array(
1706
+			'7.1' => false,
1707
+			'7.2' => true,
1708
+		),
1709
+		'sodium_crypto_sign' => array(
1710
+			'7.1' => false,
1711
+			'7.2' => true,
1712
+		),
1713
+		'sodium_crypto_stream_keygen' => array(
1714
+			'7.1' => false,
1715
+			'7.2' => true,
1716
+		),
1717
+		'sodium_crypto_stream_xor' => array(
1718
+			'7.1' => false,
1719
+			'7.2' => true,
1720
+		),
1721
+		'sodium_crypto_stream' => array(
1722
+			'7.1' => false,
1723
+			'7.2' => true,
1724
+		),
1725
+		'sodium_hex2bin' => array(
1726
+			'7.1' => false,
1727
+			'7.2' => true,
1728
+		),
1729
+		'sodium_increment' => array(
1730
+			'7.1' => false,
1731
+			'7.2' => true,
1732
+		),
1733
+		'sodium_memcmp' => array(
1734
+			'7.1' => false,
1735
+			'7.2' => true,
1736
+		),
1737
+		'sodium_memzero' => array(
1738
+			'7.1' => false,
1739
+			'7.2' => true,
1740
+		),
1741
+		'sodium_pad' => array(
1742
+			'7.1' => false,
1743
+			'7.2' => true,
1744
+		),
1745
+		'sodium_unpad' => array(
1746
+			'7.1' => false,
1747
+			'7.2' => true,
1748
+		),
1749
+		// Introduced in 7.2.14 and 7.3.1 similtanously.
1750
+		'oci_set_call_timeout' => array(
1751
+			'7.2.13' => false,
1752
+			'7.2.14' => true,
1753
+		),
1754
+		// Introduced in 7.2.14 and 7.3.1 similtanously.
1755
+		'oci_set_db_operation' => array(
1756
+			'7.2.13' => false,
1757
+			'7.2.14' => true,
1758
+		),
1759 1759
 
1760
-        'hrtime' => array(
1761
-            '7.2' => false,
1762
-            '7.3' => true,
1763
-        ),
1764
-        'is_countable' => array(
1765
-            '7.2' => false,
1766
-            '7.3' => true,
1767
-        ),
1768
-        'array_key_first' => array(
1769
-            '7.2' => false,
1770
-            '7.3' => true,
1771
-        ),
1772
-        'array_key_last' => array(
1773
-            '7.2' => false,
1774
-            '7.3' => true,
1775
-        ),
1776
-        'fpm_get_status' => array(
1777
-            '7.2' => false,
1778
-            '7.3' => true,
1779
-        ),
1780
-        'net_get_interfaces' => array(
1781
-            '7.2' => false,
1782
-            '7.3' => true,
1783
-        ),
1784
-        'gmp_binomial' => array(
1785
-            '7.2' => false,
1786
-            '7.3' => true,
1787
-        ),
1788
-        'gmp_lcm' => array(
1789
-            '7.2' => false,
1790
-            '7.3' => true,
1791
-        ),
1792
-        'gmp_perfect_power' => array(
1793
-            '7.2' => false,
1794
-            '7.3' => true,
1795
-        ),
1796
-        'gmp_kronecker' => array(
1797
-            '7.2' => false,
1798
-            '7.3' => true,
1799
-        ),
1800
-        'ldap_add_ext' => array(
1801
-            '7.2' => false,
1802
-            '7.3' => true,
1803
-        ),
1804
-        'ldap_bind_ext' => array(
1805
-            '7.2' => false,
1806
-            '7.3' => true,
1807
-        ),
1808
-        'ldap_delete_ext' => array(
1809
-            '7.2' => false,
1810
-            '7.3' => true,
1811
-        ),
1812
-        'ldap_exop_refresh' => array(
1813
-            '7.2' => false,
1814
-            '7.3' => true,
1815
-        ),
1816
-        'ldap_mod_add_ext' => array(
1817
-            '7.2' => false,
1818
-            '7.3' => true,
1819
-        ),
1820
-        'ldap_mod_replace_ext' => array(
1821
-            '7.2' => false,
1822
-            '7.3' => true,
1823
-        ),
1824
-        'ldap_mod_del_ext' => array(
1825
-            '7.2' => false,
1826
-            '7.3' => true,
1827
-        ),
1828
-        'ldap_rename_ext' => array(
1829
-            '7.2' => false,
1830
-            '7.3' => true,
1831
-        ),
1832
-        'normalizer_get_raw_decomposition' => array(
1833
-            '7.2' => false,
1834
-            '7.3' => true,
1835
-        ),
1836
-        'openssl_pkey_derive' => array(
1837
-            '7.2' => false,
1838
-            '7.3' => true,
1839
-        ),
1840
-        'socket_wsaprotocol_info_export' => array(
1841
-            '7.2' => false,
1842
-            '7.3' => true,
1843
-        ),
1844
-        'socket_wsaprotocol_info_import' => array(
1845
-            '7.2' => false,
1846
-            '7.3' => true,
1847
-        ),
1848
-        'socket_wsaprotocol_info_release' => array(
1849
-            '7.2' => false,
1850
-            '7.3' => true,
1851
-        ),
1760
+		'hrtime' => array(
1761
+			'7.2' => false,
1762
+			'7.3' => true,
1763
+		),
1764
+		'is_countable' => array(
1765
+			'7.2' => false,
1766
+			'7.3' => true,
1767
+		),
1768
+		'array_key_first' => array(
1769
+			'7.2' => false,
1770
+			'7.3' => true,
1771
+		),
1772
+		'array_key_last' => array(
1773
+			'7.2' => false,
1774
+			'7.3' => true,
1775
+		),
1776
+		'fpm_get_status' => array(
1777
+			'7.2' => false,
1778
+			'7.3' => true,
1779
+		),
1780
+		'net_get_interfaces' => array(
1781
+			'7.2' => false,
1782
+			'7.3' => true,
1783
+		),
1784
+		'gmp_binomial' => array(
1785
+			'7.2' => false,
1786
+			'7.3' => true,
1787
+		),
1788
+		'gmp_lcm' => array(
1789
+			'7.2' => false,
1790
+			'7.3' => true,
1791
+		),
1792
+		'gmp_perfect_power' => array(
1793
+			'7.2' => false,
1794
+			'7.3' => true,
1795
+		),
1796
+		'gmp_kronecker' => array(
1797
+			'7.2' => false,
1798
+			'7.3' => true,
1799
+		),
1800
+		'ldap_add_ext' => array(
1801
+			'7.2' => false,
1802
+			'7.3' => true,
1803
+		),
1804
+		'ldap_bind_ext' => array(
1805
+			'7.2' => false,
1806
+			'7.3' => true,
1807
+		),
1808
+		'ldap_delete_ext' => array(
1809
+			'7.2' => false,
1810
+			'7.3' => true,
1811
+		),
1812
+		'ldap_exop_refresh' => array(
1813
+			'7.2' => false,
1814
+			'7.3' => true,
1815
+		),
1816
+		'ldap_mod_add_ext' => array(
1817
+			'7.2' => false,
1818
+			'7.3' => true,
1819
+		),
1820
+		'ldap_mod_replace_ext' => array(
1821
+			'7.2' => false,
1822
+			'7.3' => true,
1823
+		),
1824
+		'ldap_mod_del_ext' => array(
1825
+			'7.2' => false,
1826
+			'7.3' => true,
1827
+		),
1828
+		'ldap_rename_ext' => array(
1829
+			'7.2' => false,
1830
+			'7.3' => true,
1831
+		),
1832
+		'normalizer_get_raw_decomposition' => array(
1833
+			'7.2' => false,
1834
+			'7.3' => true,
1835
+		),
1836
+		'openssl_pkey_derive' => array(
1837
+			'7.2' => false,
1838
+			'7.3' => true,
1839
+		),
1840
+		'socket_wsaprotocol_info_export' => array(
1841
+			'7.2' => false,
1842
+			'7.3' => true,
1843
+		),
1844
+		'socket_wsaprotocol_info_import' => array(
1845
+			'7.2' => false,
1846
+			'7.3' => true,
1847
+		),
1848
+		'socket_wsaprotocol_info_release' => array(
1849
+			'7.2' => false,
1850
+			'7.3' => true,
1851
+		),
1852 1852
 
1853
-        'get_mangled_object_vars' => array(
1854
-            '7.3' => false,
1855
-            '7.4' => true,
1856
-        ),
1857
-        'mb_str_split' => array(
1858
-            '7.3' => false,
1859
-            '7.4' => true,
1860
-        ),
1861
-        'openssl_x509_verify' => array(
1862
-            '7.3' => false,
1863
-            '7.4' => true,
1864
-        ),
1865
-        'password_algos' => array(
1866
-            '7.3' => false,
1867
-            '7.4' => true,
1868
-        ),
1869
-        'pcntl_unshare' => array(
1870
-            '7.3' => false,
1871
-            '7.4' => true,
1872
-        ),
1873
-        'sapi_windows_set_ctrl_handler' => array(
1874
-            '7.3' => false,
1875
-            '7.4' => true,
1876
-        ),
1877
-        'sapi_windows_generate_ctrl_event' => array(
1878
-            '7.3' => false,
1879
-            '7.4' => true,
1880
-        ),
1881
-    );
1853
+		'get_mangled_object_vars' => array(
1854
+			'7.3' => false,
1855
+			'7.4' => true,
1856
+		),
1857
+		'mb_str_split' => array(
1858
+			'7.3' => false,
1859
+			'7.4' => true,
1860
+		),
1861
+		'openssl_x509_verify' => array(
1862
+			'7.3' => false,
1863
+			'7.4' => true,
1864
+		),
1865
+		'password_algos' => array(
1866
+			'7.3' => false,
1867
+			'7.4' => true,
1868
+		),
1869
+		'pcntl_unshare' => array(
1870
+			'7.3' => false,
1871
+			'7.4' => true,
1872
+		),
1873
+		'sapi_windows_set_ctrl_handler' => array(
1874
+			'7.3' => false,
1875
+			'7.4' => true,
1876
+		),
1877
+		'sapi_windows_generate_ctrl_event' => array(
1878
+			'7.3' => false,
1879
+			'7.4' => true,
1880
+		),
1881
+	);
1882 1882
 
1883 1883
 
1884
-    /**
1885
-     * Returns an array of tokens this test wants to listen for.
1886
-     *
1887
-     * @return array
1888
-     */
1889
-    public function register()
1890
-    {
1891
-        // Handle case-insensitivity of function names.
1892
-        $this->newFunctions = $this->arrayKeysToLowercase($this->newFunctions);
1884
+	/**
1885
+	 * Returns an array of tokens this test wants to listen for.
1886
+	 *
1887
+	 * @return array
1888
+	 */
1889
+	public function register()
1890
+	{
1891
+		// Handle case-insensitivity of function names.
1892
+		$this->newFunctions = $this->arrayKeysToLowercase($this->newFunctions);
1893 1893
 
1894
-        return array(\T_STRING);
1895
-    }
1894
+		return array(\T_STRING);
1895
+	}
1896 1896
 
1897
-    /**
1898
-     * Processes this test, when one of its tokens is encountered.
1899
-     *
1900
-     * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
1901
-     * @param int                   $stackPtr  The position of the current token in
1902
-     *                                         the stack passed in $tokens.
1903
-     *
1904
-     * @return void
1905
-     */
1906
-    public function process(File $phpcsFile, $stackPtr)
1907
-    {
1908
-        $tokens = $phpcsFile->getTokens();
1897
+	/**
1898
+	 * Processes this test, when one of its tokens is encountered.
1899
+	 *
1900
+	 * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned.
1901
+	 * @param int                   $stackPtr  The position of the current token in
1902
+	 *                                         the stack passed in $tokens.
1903
+	 *
1904
+	 * @return void
1905
+	 */
1906
+	public function process(File $phpcsFile, $stackPtr)
1907
+	{
1908
+		$tokens = $phpcsFile->getTokens();
1909 1909
 
1910
-        $ignore = array(
1911
-            \T_DOUBLE_COLON    => true,
1912
-            \T_OBJECT_OPERATOR => true,
1913
-            \T_FUNCTION        => true,
1914
-            \T_CONST           => true,
1915
-        );
1910
+		$ignore = array(
1911
+			\T_DOUBLE_COLON    => true,
1912
+			\T_OBJECT_OPERATOR => true,
1913
+			\T_FUNCTION        => true,
1914
+			\T_CONST           => true,
1915
+		);
1916 1916
 
1917
-        $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
1918
-        if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
1919
-            // Not a call to a PHP function.
1920
-            return;
1917
+		$prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true);
1918
+		if (isset($ignore[$tokens[$prevToken]['code']]) === true) {
1919
+			// Not a call to a PHP function.
1920
+			return;
1921 1921
 
1922
-        } elseif ($tokens[$prevToken]['code'] === \T_NS_SEPARATOR && $tokens[$prevToken - 1]['code'] === \T_STRING) {
1923
-            // Namespaced function.
1924
-            return;
1925
-        }
1922
+		} elseif ($tokens[$prevToken]['code'] === \T_NS_SEPARATOR && $tokens[$prevToken - 1]['code'] === \T_STRING) {
1923
+			// Namespaced function.
1924
+			return;
1925
+		}
1926 1926
 
1927
-        $function   = $tokens[$stackPtr]['content'];
1928
-        $functionLc = strtolower($function);
1927
+		$function   = $tokens[$stackPtr]['content'];
1928
+		$functionLc = strtolower($function);
1929 1929
 
1930
-        if (isset($this->newFunctions[$functionLc]) === false) {
1931
-            return;
1932
-        }
1930
+		if (isset($this->newFunctions[$functionLc]) === false) {
1931
+			return;
1932
+		}
1933 1933
 
1934
-        $itemInfo = array(
1935
-            'name'   => $function,
1936
-            'nameLc' => $functionLc,
1937
-        );
1938
-        $this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
1939
-    }
1934
+		$itemInfo = array(
1935
+			'name'   => $function,
1936
+			'nameLc' => $functionLc,
1937
+		);
1938
+		$this->handleFeature($phpcsFile, $stackPtr, $itemInfo);
1939
+	}
1940 1940
 
1941 1941
 
1942
-    /**
1943
-     * Get the relevant sub-array for a specific item from a multi-dimensional array.
1944
-     *
1945
-     * @param array $itemInfo Base information about the item.
1946
-     *
1947
-     * @return array Version and other information about the item.
1948
-     */
1949
-    public function getItemArray(array $itemInfo)
1950
-    {
1951
-        return $this->newFunctions[$itemInfo['nameLc']];
1952
-    }
1942
+	/**
1943
+	 * Get the relevant sub-array for a specific item from a multi-dimensional array.
1944
+	 *
1945
+	 * @param array $itemInfo Base information about the item.
1946
+	 *
1947
+	 * @return array Version and other information about the item.
1948
+	 */
1949
+	public function getItemArray(array $itemInfo)
1950
+	{
1951
+		return $this->newFunctions[$itemInfo['nameLc']];
1952
+	}
1953 1953
 
1954 1954
 
1955
-    /**
1956
-     * Get the error message template for this sniff.
1957
-     *
1958
-     * @return string
1959
-     */
1960
-    protected function getErrorMsgTemplate()
1961
-    {
1962
-        return 'The function %s() is not present in PHP version %s or earlier';
1963
-    }
1955
+	/**
1956
+	 * Get the error message template for this sniff.
1957
+	 *
1958
+	 * @return string
1959
+	 */
1960
+	protected function getErrorMsgTemplate()
1961
+	{
1962
+		return 'The function %s() is not present in PHP version %s or earlier';
1963
+	}
1964 1964
 }
Please login to merge, or discard this patch.