Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 24 | class ConfigFactory |
||
| 25 | { |
||
| 26 | |||
| 27 | /** |
||
| 28 | * Cached contents of the config files. |
||
| 29 | * |
||
| 30 | * @since 0.4.3 |
||
| 31 | * |
||
| 32 | * @var array |
||
| 33 | */ |
||
| 34 | protected static $configFilesCache = []; |
||
| 35 | |||
| 36 | /** |
||
| 37 | * Create a new ConfigInterface object from a file. |
||
| 38 | * |
||
| 39 | * If a comma-separated list of files is provided, they are checked in sequence until the first one could be loaded |
||
| 40 | * successfully. |
||
| 41 | * |
||
| 42 | * @since 0.3.0 |
||
| 43 | * |
||
| 44 | * @param string|array $_ List of files. |
||
| 45 | * |
||
| 46 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
|
|
|||
| 47 | */ |
||
| 48 | 2 | public static function createFromFile($_) |
|
| 49 | { |
||
| 50 | 2 | $files = array_reverse(func_get_args()); |
|
| 51 | |||
| 52 | 2 | if (is_array($files[0])) { |
|
| 53 | 1 | $files = $files[0]; |
|
| 54 | } |
||
| 55 | |||
| 56 | 2 | View Code Duplication | while (count($files) > 0) { |
| 57 | try { |
||
| 58 | 2 | $file = array_pop($files); |
|
| 59 | |||
| 60 | 2 | if (! is_readable($file)) { |
|
| 61 | 1 | continue; |
|
| 62 | } |
||
| 63 | |||
| 64 | 2 | $config = static::createFromArray( |
|
| 65 | static::getFromCache($file, function ($file) { |
||
| 66 | 1 | return Loader::load($file); |
|
| 67 | 2 | }) |
|
| 68 | ); |
||
| 69 | |||
| 70 | 2 | if (null === $config) { |
|
| 71 | continue; |
||
| 72 | } |
||
| 73 | |||
| 74 | 2 | return $config; |
|
| 75 | } catch (Exception $exception) { |
||
| 76 | // Fail silently and try next file. |
||
| 77 | } |
||
| 78 | } |
||
| 79 | |||
| 80 | return static::createFromArray([]); |
||
| 81 | } |
||
| 82 | |||
| 83 | /** |
||
| 84 | * Create a new ConfigInterface object from an array. |
||
| 85 | * |
||
| 86 | * @since 0.3.0 |
||
| 87 | * |
||
| 88 | * @param array $array Array with configuration values. |
||
| 89 | * |
||
| 90 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
| 91 | */ |
||
| 92 | 2 | public static function createFromArray(array $array) |
|
| 102 | |||
| 103 | /** |
||
| 104 | * Create a new ConfigInterface object. |
||
| 105 | * |
||
| 106 | * Tries to deduce the correct creation method by inspecting the provided arguments. |
||
| 107 | * |
||
| 108 | * @since 0.3.0 |
||
| 109 | * |
||
| 110 | * @param mixed $_ Array with configuration values. |
||
| 111 | * |
||
| 112 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
| 113 | */ |
||
| 114 | 4 | View Code Duplication | public static function create($_) |
| 128 | |||
| 129 | /** |
||
| 130 | * Create a new ConfigInterface object, by merging several files together. |
||
| 131 | * |
||
| 132 | * Duplicate keys in later files will override those in earlier files. |
||
| 133 | * |
||
| 134 | * @since 0.4.6 |
||
| 135 | * |
||
| 136 | * @param mixed $_ Array with configuration values. |
||
| 137 | * |
||
| 138 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
| 139 | */ |
||
| 140 | 2 | View Code Duplication | public static function merge($_) |
| 154 | |||
| 155 | /** |
||
| 156 | * Create a new ConfigInterface object by merging data from several files. |
||
| 157 | * |
||
| 158 | * If a comma-separated list of files is provided, they are loaded in sequence and later files override settings in |
||
| 159 | * earlier files. |
||
| 160 | * |
||
| 161 | * @since 0.4.6 |
||
| 162 | * |
||
| 163 | * @param string|array $_ List of files. |
||
| 164 | * |
||
| 165 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
| 166 | */ |
||
| 167 | public static function mergeFromFiles($_) |
||
| 200 | |||
| 201 | /** |
||
| 202 | * Create a new ConfigInterface object from a file and return a sub-portion of it. |
||
| 203 | * |
||
| 204 | * The first argument needs to be the file name to load, and the subsequent arguments will be passed on to |
||
| 205 | * `Config::getSubConfig()`. |
||
| 206 | * |
||
| 207 | * @since 0.4.5 |
||
| 208 | * |
||
| 209 | * @param mixed $_ File name of the config to load as a string, followed by an array of keys to pass to |
||
| 210 | * `Config::getSubConfig()`. |
||
| 211 | * |
||
| 212 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
| 213 | */ |
||
| 214 | 1 | public static function createSubConfig($_) |
|
| 227 | |||
| 228 | /** |
||
| 229 | * Get a config file from the config file cache. |
||
| 230 | * |
||
| 231 | * @since 0.4.4 |
||
| 232 | * |
||
| 233 | * @param string $identifier Identifier to look for in the cache. |
||
| 234 | * @param mixed $fallback Fallback to use to fill the cache. If $fallback is a callable, it will be executed |
||
| 235 | * with $identifier as an argument. |
||
| 236 | * |
||
| 237 | * @return mixed The latest content of the cache for the given identifier. |
||
| 238 | */ |
||
| 239 | 1 | protected static function getFromCache($identifier, $fallback) |
|
| 249 | } |
||
| 250 |
This check compares the return type specified in the
@returnannotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.