Exakat PHP Index of Coding : August 2018
Exakat PHP Index of Coding : August 2018

Exakat PHP Index of coding

Not using @ is the poster child of good practices. It’s also looked upon, as an impossible goal. Did you know that the @ operator is only merely used by 50% of PHP applications ? Same for parenthesis with include and co : don’t use them, like 50% of the developpers. This is how the Exakat PHP Index of coding was born.

Every month, Exakat runs thousands of analysis on half a million lines of PHP code. This is primarily for testing purpose, a kind of torture test that checks the engine run on any kind of code. And it is very useful to ensure all situations are correctly handled.

We also extracted the following stats out of 1700+ projects, analysis by analysis. This way, any issue may be ranked from ‘wide spread’ to ‘very unusual’. In fact, ‘wide spread’ may also be understood as : ‘almost a feature’. May be we can suggest a few of them to wiki.php.net.

Each analysis is ranked below, with its frequency of appearance in code, its progression. If you want to test your own code, just install exakat and run an audit.

is for new analysis, and is for old one.

May 2018 Aug 2018 Prog. Name Rating Change
1 1 Uses Default Values   94.44 % -0.22 %
2 2 Used Once Variables (In Scope)   92.05 % 0.58 %
3 5 Should Use Local Class   91.95 % 1.37 %
4 3 Unused Methods   91.59 % 0.53 %
5 7 Overwriting Variable   87.57 % -0.29 %
6 39 Bail Out Early   85.68 % 22.90 %
7 17 Used Once Variables   85.63 % 11.58 %
8 8 PHP Keywords As Names   84.46 % 2.13 %
9 160 Written Only Variables   84.10 % 57.54 %
10 9 Unresolved Classes   81.35 % 1.06 %
11 10 Property Used In One Method Only   81.04 % 2.23 %
12 100 Empty Blocks   80.99 % 38.81 %
13 12 Unused Classes   80.69 % 2.39 %
14 11 Undefined Classes   79.87 % 1.15 %
15 13 Unitialized Properties   79.62 % 2.52 %
16 15 Relay Function   78.24 % 2.34 %
17 14 Nested Ifthen   77.58 % 0.59 %
18 19 Unused Arguments   76.51 % 3.44 %
19 18 Should Make Ternary   74.83 % 0.87 %
20 20 Useless Parenthesis   74.42 % 1.57 %
21 26 Preprocessable   74.22 % 4.51 %
22 21 Mark Callable   73.81 % 1.83 %
23 22 No Boolean As Default   73.45 % 1.59 %
24 23 Use Named Boolean In Argument Definition   73.30 % 1.69 %
25 30 Long Arguments   72.64 % 3.92 %
26 25 Strict Comparison With Booleans   72.23 % 1.30 %
27 27 Avoid Optional Properties   72.18 % 2.94 %
28 29 Overwritten Literals   71.11 % 2.27 %
29 24 Buried Assignation   70.91 % -0.16 %
30 44 Assigned Twice   69.38 % 7.98 %
31 28 Property Variable Confusion   69.28 % 0.34 %
32 32 Pre-increment   68.46 % 1.97 %
33 34 Constant Class   68.36 % 2.66 %
34 31 Use Positive Condition   67.90 % 0.05 %
35 16 Locally Unused Property   67.80 % -7.21 %
36 37 Could Make A Function   67.14 % 3.08 %
37 36 Used Once Property   67.09 % 2.87 %
38 71 Undefined Parent   66.98 % 15.76 %
39 35 No Need For Else   66.07 % 1.48 %
40 73 Property Could Be Local   65.41 % 14.97 %
41 42 Never Used Properties   64.23 % 2.57 %
42 53 Drop Else After Return   64.18 % 6.63 %
43 46 No Class In Global   64.08 % 3.10 %
44 40 Switch To Switch   63.93 % 1.62 %
45 41 Iffectations   63.72 % 1.52 %
46 45 No Class As Typehint   63.42 % 2.28 %
47 56 Empty Function   62.91 % 5.88 %
48 49 Local Globals   61.94 % 3.14 %
49 51 Undefined Interfaces   60.72 % 2.65 %
50 38 Use Class Operator   60.46 % -2.73 %
51 80 Missing Include   60.21 % 11.50 %
52 55 Dont Change The Blind Var   59.65 % 2.31 %
53 50 Check All Types   59.55 % 1.40 %
54 58 include_once() Usage   59.50 % 3.47 %
55 54 Else If Versus Elseif   58.68 % 1.18 %
56 61 Method Used Below   57.31 % 3.58 %
57 59 No Parenthesis For Language Construct   57.20 % 1.38 %
58 N/A Check JSON   56.90 % 56.90 %
59 63 Exit() Usage   55.37 % 2.16 %
60 62 @ Operator   55.32 % 1.95 %
61 N/A Ambiguous Visibilities   54.86 % 54.86 %
62 65 Echo With Concat   54.81 % 2.67 %
63 66 Switch Without Default   54.71 % 2.60 %
64 72 Unresolved Use   53.84 % 3.03 %
65 69 Uncaught Exceptions   53.74 % 2.23 %
66 308 Non Ascii Variables   53.64 % 52.34 %
67 76 Logical To in_array   52.16 % 2.56 %
68 77 Use Instanceof   51.70 % 2.31 %
69 67 Static Loop   51.65 % 0.06 %
70 200 Too Many Local Variables   51.55 % 32.37 %
71 163 Hardcoded Passwords   51.50 % 25.21 %
72 74 Common Alternatives   51.50 % 1.69 %
73 176 Useless Abstract Class   51.34 % 26.93 %
74 84 No Public Access   51.09 % 3.47 %
75 83 Use random_int()   50.89 % 3.01 %
76 78 Several Instructions On The Same Line   50.28 % 1.15 %
77 81 Use === null   50.07 % 1.88 %
78 131 Should Use Coalesce   50.02 % 15.82 %
79 68 Empty Classes   49.36 % -2.15 %
80 91 Undefined Properties   49.31 % 4.36 %
81 79 Empty Instructions   49.26 % 0.44 %
82 75 Function Subscripting, Old Style   48.75 % -0.85 %
83 87 Mismatched Ternary Alternatives   48.75 % 2.28 %
84 88 Useless Referenced Argument   48.65 % 2.50 %
85 114 Useless Instructions   48.39 % 11.33 %
86 70 Undefined Functions   48.34 % -2.99 %
87 90 String May Hold A Variable   48.24 % 2.85 %
88 89 Could Use Short Assignation   48.19 % 2.25 %
89 57 Undefined Constants   47.27 % -9.23 %
90 N/A Mismatch Type And Default   47.07 % 47.07 %
91 85 Could Typehint   46.91 % -0.26 %
92 96 Ambiguous Static   46.66 % 2.96 %
93 94 Use const   46.51 % 2.08 %
94 60 Class Name Case Difference   46.35 % -9.00 %
95 93 No Substr() One   46.20 % 1.72 %
96 82 Identical Consecutive Expression   46.15 % -1.78 %
97 204 Strange Name For Variables   45.23 % 26.62 %
98 109 Double Instructions   45.18 % 5.20 %
99 95 Useless Interfaces   45.08 % 1.23 %
100 101 Aliases Usage   44.88 % 2.75 %
101 103 Unused Use   44.47 % 2.71 %
102 99 Should Typecast   43.81 % 1.53 %
103 106 Double Assignation   43.81 % 3.30 %
104 104 Undefined Class Constants   43.65 % 1.94 %
105 102 No array_merge() In Loops   43.55 % 1.77 %
106 108 Repeated print()   42.43 % 2.39 %
107 115 Cast To Boolean   42.33 % 5.38 %
108 117 Forgotten Visibility   41.97 % 5.26 %
109 110 Parent First   41.97 % 1.99 %
110 105 Return True False   41.26 % 0.16 %
111 86 Strpos()-like Comparison   41.11 % -5.57 %
112 111 Unreachable Code   40.70 % 1.85 %
113 92 Could Be Typehinted Callable   40.14 % -4.36 %
114 113 Timestamp Difference   39.68 % 2.36 %
115 52 Altering Foreach Without Reference   38.86 % -18.69 %
116 118 Global Usage   38.51 % 2.29 %
117 N/A Strpos Too Much   38.15 % 38.15 %
118 119 Useless Check   38.05 % 1.83 %
119 121 Logical Should Use Symbolic Operators   37.79 % 2.09 %
120 140 Unused Private Methods   37.74 % 6.38 %
121 150 Assign Default To Properties   37.44 % 8.75 %
122 124 Could Use self   37.08 % 2.11 %
123 250 Unknown Directive Name   36.93 % 27.06 %
124 123 Modernize Empty With Expression   36.93 % 1.75 %
125 127 Could Use __DIR__   36.88 % 2.31 %
126 122 If With Same Conditions   36.83 % 1.50 %
127 126 Same Conditions In Condition   36.67 % 1.89 %
128 130 Could Be Else   36.62 % 2.39 %
129 N/A Method Signature Must Be Compatible   36.47 % 36.47 %
130 97 Mixed Concat And Interpolation   36.01 % -7.40 %
131 112 Unused Functions   35.86 % -1.82 %
132 137 Don’t Change Incomings   35.86 % 3.40 %
133 128 Unresolved Instanceof   35.65 % 1.14 %
134 138 var_dump()… Usage   35.35 % 3.10 %
135 136 Useless Catch   35.04 % 2.43 %
136 134 Htmlentities Calls   34.99 % 1.70 %
137 144 Too Many Native Calls   34.69 % 4.27 %
138 139 Should Make Alias   34.64 % 3.23 %
139 125 Repeated Regex   34.38 % -0.55 %
140 135 Wrong Parameter Type   33.92 % 0.68 %
141 107 Class Should Be Final By Ocramius   33.92 % -6.17 %
142 141 Empty Try Catch   33.82 % 2.72 %
143 142 Unchecked Resources   33.82 % 3.14 %
144 148 Never Used Parameter   33.67 % 4.14 %
145 145 Unconditional Break In Loop   33.41 % 3.20 %
146 43 Could Use Alias   32.80 % -28.72 %
147 288 Callback Needs Return   32.70 % 28.68 %
148 146 No Choice   32.60 % 2.44 %
149 157 Avoid Using stdClass   32.39 % 5.26 %
150 143 Multiple Type Variable   32.09 % 1.57 %
151 133 No Return Used   31.83 % -2.32 %
152 149 Multiple Alias Definitions   31.78 % 2.56 %
153 199 Don’t Unset Properties   31.73 % 12.50 %
154 155 Randomly Sorted Arrays   31.12 % 3.82 %
155 129 Unused Constants   31.02 % -3.42 %
156 147 Unthrown Exception   30.87 % 1.27 %
157 153 Printf Number Of Arguments   30.41 % 2.71 %
158 165 No Hardcoded Hash   30.31 % 4.13 %
159 151 Implicit Global   30.05 % 1.62 %
160 161 No Direct Call To Magic Method   30.05 % 3.54 %
161 N/A Incompatible Signature Methods   29.69 % 29.69 %
162 154 Make Global A Property   29.49 % 1.89 %
163 N/A Weak Typing   29.34 % 29.34 %
164 156 Wrong Number Of Arguments   29.19 % 1.96 %
165 N/A Dont Mix ++   29.13 % 29.13 %
166 158 Eval() Usage   28.88 % 2.07 %
167 159 Multiple Constant Definition   28.83 % 2.12 %
168 166 list() May Omit Variables   28.73 % 2.74 %
169 162 Wrong Optional Parameter   28.62 % 2.12 %
170 168 Static Methods Called From Object   28.37 % 2.80 %
171 167 Sequences In For   28.27 % 2.49 %
172 213 Don’t Echo Error   28.22 % 10.71 %
173 164 Don’t Send This In Constructor   28.17 % 1.88 %
174 152 Only Variable Passed By Reference   27.96 % 0.04 %
175 170 Unused Returned Value   27.15 % 2.12 %
176 175 Useless Constructor   26.84 % 2.38 %
177 171 One Variable String   26.69 % 1.71 %
178 116 Unused Private Properties   26.54 % -10.31 %
179 169 Objects Don’t Need References   26.49 % 1.14 %
180 182 Incompilable Files   26.18 % 2.77 %
181 180 Dangling Array References   26.03 % 1.78 %
182 174 Implied If   25.92 % 1.25 %
183 181 Should Chain Exception   25.92 % 1.98 %
184 178 Empty Interfaces   25.77 % 1.47 %
185 172 Print And Die   25.77 % 1.05 %
186 185 No Hardcoded Path   25.67 % 2.67 %
187 183 No Direct Usage   25.06 % 1.65 %
188 187 Useless Return   24.19 % 2.19 %
189 188 Undefined static:: Or self::   24.09 % 2.35 %
190 177 Forgotten Interface   23.73 % -0.59 %
191 186 Useless Global   23.68 % 1.25 %
192 190 Adding Zero   23.58 % 2.73 %
193 192 Useless Casting   22.97 % 2.38 %
194 191 Multiple Index Definition   22.72 % 2.12 %
195 198 Mistaken Concatenation   22.61 % 3.22 %
196 189 Unset In Foreach   22.56 % 1.08 %
197 193 Useless Switch   22.31 % 1.92 %
198 196 Unused Global   21.80 % 1.98 %
199 217 $this Belongs To Classes Or Traits   21.44 % 6.18 %
200 195 Var Keyword   21.34 % 1.48 %
201 N/A Undefined ::class   21.34 % 21.34 %
202 206 Redefined Default   21.19 % 2.69 %
203 N/A Cant Instantiate Class   21.03 % 21.03 %
204 194 Forgotten Thrown   20.98 % 0.69 %
205 197 Should Use Prepared Statement   20.83 % 1.23 %
206 203 Avoid get_class()   20.78 % 1.97 %
207 229 eval() Without Try   20.73 % 7.25 %
208 202 No Isset With Empty   20.47 % 1.45 %
209 208 Test Then Cast   20.42 % 2.23 %
210 N/A Classes/CouldBeAbstractClass   20.42 % 20.42 %
211 209 Logical Mistakes   20.27 % 2.18 %
212 212 No Hardcoded Ip   20.02 % 2.30 %
213 214 Useless Unset   19.91 % 2.45 %
214 207 Deprecated Functions   19.81 % 1.47 %
215 201 Alternative Syntax Consistence   19.61 % 0.53 %
216 184 Mismatched Default Arguments   19.51 % -3.90 %
217 215 Use Object Api   19.10 % 2.16 %
218 340 Implemented Methods Are Public   19.05 % 19.00 %
219 210 Multiply By One   19.00 % 1.18 %
220 205 Could Be Static   18.79 % 0.24 %
221 216 Non-constant Index In Array   17.37 % 1.48 %
222 219 One Letter Functions   16.76 % 1.71 %
223 220 Foreach Reference Is Not Modified   16.65 % 1.65 %
224 222 Use With Fully Qualified Name   16.35 % 1.93 %
225 223 Should Use Constants   16.35 % 1.93 %
226 218 Non Static Methods Called In A Static   16.30 % 1.14 %
227 179 Use Constant As Arguments   16.04 % -8.26 %
228 230 Identical Conditions   15.94 % 2.51 %
229 221 Results May Be Missing   15.89 % 1.10 %
230 228 Undefined Trait   15.84 % 2.04 %
231 232 Illegal Name For Method   15.69 % 3.04 %
232 132 Unused Inherited Variable In Closure   15.63 % -18.55 %
233 225 Forgotten Whitespace   15.38 % 1.17 %
234 233 Unpreprocessed Values   15.23 % 3.00 %
235 211 Unused Interfaces   15.18 % -2.64 %
236 226 Old Style Constructor   15.07 % 1.16 %
237 240 Strings With Strange Space   14.92 % 3.63 %
238 227 While(List() = Each())   14.26 % 0.46 %
239 241 Dependant Trait   13.70 % 2.57 %
240 238 Redeclared PHP Functions   13.55 % 2.00 %
241 236 Hidden Use Expression   13.55 % 1.79 %
242 235 Indices Are Int Or String   13.24 % 1.12 %
243 239 self, parent, static Outside Class   13.14 % 1.80 %
244 237 Suspicious Comparison   13.14 % 1.38 %
245 242 Catch Overwrite Variable   12.88 % 1.91 %
246 246 Lone Blocks   12.37 % 1.87 %
247 247 Useless Brackets   12.37 % 1.87 %
248 244 Already Parents Interface   12.27 % 1.40 %
249 243 Nested Ternary   12.22 % 1.30 %
250 231 Must Return Methods   12.17 % -0.68 %
251 248 Identical On Both Sides   12.17 % 1.67 %
252 224 Could Use str_repeat()   11.71 % -2.51 %
253 245 Or Die   11.36 % 0.64 %
254 249 Phpinfo   11.25 % 1.11 %
255 257 No Real Comparison   11.10 % 2.21 %
256 173 Invalid Regex   11.00 % -13.72 %
257 251 Overwritten Exceptions   10.95 % 1.18 %
258 253 Wrong fopen() Mode   10.95 % 1.28 %
259 252 Deep Definitions   10.39 % 0.72 %
260 255 Unknown Pcre2 Option   10.39 % 1.14 %
261 256 Avoid Parenthesis   9.98 % 0.84 %
262 258 Redefined Class Constants   9.88 % 1.00 %
263 259 Not Not   9.73 % 1.37 %
264 N/A Typehinted References   9.32 % 9.32 %
265 262 Multiples Identical Case   8.91 % 1.07 %
266 280 Redefined Private Property   8.66 % 3.86 %
267 234 Assign With And   8.50 % -3.67 %
268 261 preg_replace With Option e   8.35 % 0.20 %
269 260 Scalar Or Object Property   8.04 % -0.32 %
270 263 Same Variables Foreach   7.53 % 0.69 %
271 264 No Hardcoded Port   7.38 % 0.64 %
272 273 Class, Interface Or Trait With Identical Names   7.23 % 1.54 %
273 287 Is Actually Zero   7.18 % 2.90 %
274 270 $this Is Not An Array   6.62 % 0.72 %
275 266 Queries In Loops   6.62 % 0.20 %
276 269 Missing Parenthesis   6.62 % 0.51 %
277 275 Missing New ?   6.57 % 0.98 %
278 277 __DIR__ Then Slash   6.52 % 1.19 %
279 265 Use Pathinfo   6.31 % -0.27 %
280 274 Next Month Trap   6.11 % 0.52 %
281 293 Wrong Range Check   6.01 % 3.24 %
282 282 Instantiating Abstract Class   5.96 % 1.26 %
283 279 $this Is Not For Static Methods   5.90 % 0.78 %
284 N/A Continue Is For Loop   5.85 % 5.85 %
285 278 Static Methods Can’t Contain $this   5.80 % 0.68 %
286 281 Ambiguous Array Index   5.75 % 1.05 %
287 254 Access Protected Structures   5.55 % -4.01 %
288 286 Lost References   5.39 % 1.06 %
289 276 Failed Substr Comparison   5.29 % -0.19 %
290 285 Too Many Finds   5.24 % 0.69 %
291 283 No Magic With Array   5.14 % 0.44 %
292 284 Old Style __autoload()   4.99 % 0.34 %
293 290 Empty Traits   4.89 % 1.18 %
294 296 Strtr Arguments   4.73 % 2.33 %
295 289 Multiple Class Declarations   3.87 % 0.01 %
296 291 Throw Functioncall   3.76 % 0.58 %
297 292 Unused Traits   3.56 % 0.59 %
298 295 Crc32() Might Be Negative   3.05 % 0.39 %
299 298 Implement Is For Interface   2.95 % 0.81 %
300 294 Multiple Alias Definitions Per File   2.95 % 0.29 %
301 271 Mismatched Typehint   2.85 % -3.05 %
302 N/A Bad Constants Names   2.80 % 2.80 %
303 297 Only Variable Returned By Reference   2.49 % 0.30 %
304 N/A Abstract Or Implements   2.49 % 2.49 %
305 268 Too Many Injections   2.44 % -3.73 %
306 299 Missing Cases In Switch   2.19 % 0.05 %
307 300 Ternary In Concat   2.03 % 0.10 %
308 303 Use System Tmp   1.98 % 0.21 %
309 309 Empty Namespace   1.93 % 0.63 %
310 301 Accessing Private   1.83 % 0.01 %
311 302 error_reporting() With Integers   1.78 % 0.01 %
312 322 Unused Label   1.78 % 1.16 %
313 304 Silently Cast Integer   1.78 % 0.16 %
314 305 Parent, Static Or Self Outside Class   1.68 % 0.17 %
315 307 Foreach Needs Reference Array   1.42 % 0.01 %
316 316 Inclusion Wrong Case   1.42 % 0.54 %
317 306 Classes Mutually Extending Each Other   1.17 % -0.24 %
318 311 Useless Final   1.17 % 0.02 %
319 313 Should Use SetCookie()   1.17 % 0.18 %
320 312 Constants With Strange Names   1.12 % 0.13 %
321 314 Invalid Constant Name   1.06 % 0.18 %
322 315 No Empty Regex   1.01 % 0.13 %
323 320 __toString() Throws Exception   0.86 % 0.19 %
324 318 Always Positive Comparison   0.81 % 0.08 %
325 317 Throw In Destruct   0.81 % 0.03 %
326 319 Class Function Confusion   0.81 % 0.08 %
327 310 Break Outside Loop   0.71 % -0.54 %
328 267 Unkown Regex Options   0.71 % -5.51 %
329 321 Multiple Identical Trait Or Interface   0.66 % -0.01 %
330 N/A Can’t Throw Throwable   0.56 % 0.56 %
331 326 Compared Comparison   0.50 % 0.19 %
332 325 No Reference For Ternary   0.45 % 0.09 %
333 324 Throws An Assignement   0.40 % 0.04 %
334 327 No Reference On Left Side   0.40 % 0.09 %
335 N/A Undefined Variable   0.40 % 0.40 %
336 323 Abstract Static Methods   0.30 % -0.27 %
337 329 Constants Created Outside Its Namespace   0.20 % 0.05 %
338 331 Can’t Extend Final   0.20 % 0.05 %
339 328 Not A Scalar Type   0.20 % 0.00 %
340 330 Hash Algorithms   0.15 % 0.00 %
341 332 Fully Qualified Constants   0.10 % 0.00 %
342 338 Negative Power   0.10 % 0.05 %
343 339 Strange Name For Constants   0.10 % 0.05 %
344 333 Pathinfo() Returns May Vary   0.10 % 0.00 %
345 344 Possible Infinite Loop   0.10 % 0.10 %
346 335 Concrete Visibility   0.05 % 0.00 %
347 272 No Self Referencing Constant   0.05 % -5.70 %
348 337 func_get_arg() Modified   0.05 % 0.00 %
349 341 No get_class() With Null   0.05 % 0.00 %
350 334 Foreach On Object   0.05 % -0.05 %
351 342 Short Open Tags   0.00 % 0.00 %
352 336 Empty List   0.00 % -0.05 %
353 343 Using $this Outside A Class   0.00 % 0.00 %
354 N/A Assert Function Is Reserved   0.00 % 0.00 %
355 N/A Must Call Parent Constructor   0.00 % 0.00 %
356 N/A Undefined Insteadof   0.00 % 0.00 %

EPIC Methodology

The “Exakat PHP Index of Coding”, aka EPIC, represents how often an static analysis rule reports results when auditing PHP code. The higher the rating, the higher is the probability to report issues. The lower the rating, the rarer are the issues.

This popularity is built by analyzing 1730 Open Source project, with PHP 7.1. Any issue reported by Exakat makes the project count as affected. Only when a project reports no issues, is it counted as error free.

 

EPIC FAQ

  • Can I reuse those results in an article or in my code?
    Yes. Simply mention ‘https://178.62.231.40’ as the source, and may be the month of publication (Current is 08/2018
  • Is there a computer-readable version ? 
    The Exakat PHP Index of Coding is available as JSON .
  • How does the index handle the false-positives ?
    False positives are only human-detectable. Help us reduce the false positive by reporting bugs and informations to remove them.
  • Why are some rules down to 0 ? Aren’t they useless?
    Some analysis require an old version of PHP, while the Index works with more recent versions of PHP (7.1 at the moment). As such, those analysis will dwindle to the bottom of the ranking and disappear.