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 |
||
| 19 | class Functions { |
||
| 20 | |||
| 21 | /** |
||
| 22 | * Size of the initialisation vector for encryption |
||
| 23 | * @var integer $ENCRYPTION_IV_SIZE |
||
| 24 | */ |
||
| 25 | const ENCRYPTION_IV_SIZE = 16; |
||
| 26 | |||
| 27 | /** |
||
| 28 | * This array contains the cached short month names, based on the cal_info functions. |
||
| 29 | * Retrieves the abbrevmonths values of months: Jan, Feb, Mar... |
||
| 30 | * |
||
| 31 | * @uses cal_info |
||
| 32 | * @var array $calendarShortMonths Cached array of abbreviated short month names |
||
| 33 | */ |
||
| 34 | private static $calendarShortMonths = array(); |
||
| 35 | |||
| 36 | /** |
||
| 37 | * Debug tool: prompt a Javascript pop-up with a text |
||
| 38 | * |
||
| 39 | * @param string $text Text to display |
||
| 40 | */ |
||
| 41 | static public function promptAlert($text){ |
||
| 46 | |||
| 47 | /** |
||
| 48 | * Return the result of a division, and a default value if denomintaor is 0 |
||
| 49 | * |
||
| 50 | * @param integer $num Numerator |
||
| 51 | * @param integer $denom Denominator |
||
| 52 | * @param float $default Default value if denominator null or 0 |
||
| 53 | * @return float Result of the safe division |
||
| 54 | */ |
||
| 55 | public static function safeDivision($num, $denom, $default = 0) { |
||
| 61 | |||
| 62 | /** |
||
| 63 | * Returns the percentage of two numbers |
||
| 64 | * |
||
| 65 | * @param int $num Numerator |
||
| 66 | * @param int $denom Denominator |
||
| 67 | * @param float $default Default value if denominator null or 0 |
||
| 68 | * @return float Percentage |
||
| 69 | */ |
||
| 70 | public static function getPercentage($num, $denom, $default = 0){ |
||
| 73 | |||
| 74 | /** |
||
| 75 | * Get width and heigth of an image resized in order fit a target size. |
||
| 76 | * |
||
| 77 | * @param string $file The image to resize |
||
| 78 | * @param int $target The final max width/height |
||
| 79 | * @return array array of ($width, $height). One of them must be $target |
||
| 80 | */ |
||
| 81 | static public function getResizedImageSize($file, $target=25){ |
||
| 89 | |||
| 90 | |||
| 91 | /** |
||
| 92 | * Checks if a table exist in the DB schema |
||
| 93 | * |
||
| 94 | * @param string $table Name of the table to look for |
||
| 95 | * @return boolean Does the table exist |
||
| 96 | */ |
||
| 97 | public static function doesTableExist($table) { |
||
| 105 | |||
| 106 | /** |
||
| 107 | * Returns a randomy generated token of a given size |
||
| 108 | * |
||
| 109 | * @param int $length Length of the token, default to 32 |
||
| 110 | * @return string Random token |
||
| 111 | */ |
||
| 112 | public static function generateRandomToken($length=32) { |
||
| 131 | |||
| 132 | /** |
||
| 133 | * Checks whether the installation meets the requirements for encryption/decryption. |
||
| 134 | * |
||
| 135 | * @return boolean |
||
| 136 | */ |
||
| 137 | public static function isEncryptionCompatible() { |
||
| 140 | |||
| 141 | /** |
||
| 142 | * Encrypt a text, and encode it to base64 compatible with URL use |
||
| 143 | * (no +, no /, no =) |
||
| 144 | * |
||
| 145 | * @param string $data Text to encrypt |
||
| 146 | * @return string Encrypted and encoded text |
||
| 147 | */ |
||
| 148 | public static function encryptToSafeBase64($data){ |
||
| 164 | |||
| 165 | /** |
||
| 166 | * Decode and encrypt a text from base64 compatible with URL use |
||
| 167 | * |
||
| 168 | * @param string $encrypted Text to decrypt |
||
| 169 | * @return string Decrypted text |
||
| 170 | */ |
||
| 171 | public static function decryptFromSafeBase64($encrypted){ |
||
| 191 | |||
| 192 | /** |
||
| 193 | * Encode a string from the file system encoding to UTF-8 (if necessary) |
||
| 194 | * |
||
| 195 | * @param string $string Filesystem encoded string to encode |
||
| 196 | * @return string UTF-8 encoded string |
||
| 197 | */ |
||
| 198 | public static function encodeFileSystemToUtf8($string){ |
||
| 204 | |||
| 205 | /** |
||
| 206 | * Encode a string from UTF-8 to the file system encoding (if necessary) |
||
| 207 | * |
||
| 208 | * @param string $string UTF-8 encoded string to encode |
||
| 209 | * @return string Filesystem encoded string |
||
| 210 | */ |
||
| 211 | public static function encodeUtf8ToFileSystem($string){ |
||
| 217 | |||
| 218 | /** |
||
| 219 | * Check whether a path is under a valid form. |
||
| 220 | * |
||
| 221 | * @param string $filename Filename path to check |
||
| 222 | * @param boolean $acceptfolder Should folders be accepted? |
||
| 223 | * @return boolean True if path valid |
||
| 224 | */ |
||
| 225 | public static function isValidPath($filename, $acceptfolder = FALSE) { |
||
| 229 | |||
| 230 | /** |
||
| 231 | * Return short names for the months of the specific calendar. |
||
| 232 | * |
||
| 233 | * @see \cal_info() |
||
| 234 | * @param integer $calendarId Calendar ID (according to PHP cal_info) |
||
| 235 | * @return array Array of month short names |
||
| 236 | */ |
||
| 237 | public static function getCalendarShortMonths($calendarId = 0) { |
||
| 244 | |||
| 245 | /** |
||
| 246 | * Returns the generation associated with a Sosa number |
||
| 247 | * |
||
| 248 | * @param int $sosa Sosa number |
||
| 249 | * @return number |
||
| 250 | */ |
||
| 251 | public static function getGeneration($sosa){ |
||
| 254 | |||
| 255 | |||
| 256 | |||
| 257 | |||
| 258 | /** |
||
| 259 | * Returns whether the image type is supported by the system, and if so, return the standardised type |
||
| 260 | * |
||
| 261 | * @param string $reqtype Extension to test |
||
| 262 | * @return boolean|string Is supported? |
||
| 263 | */ |
||
| 264 | public static function isImageTypeSupported($reqtype) { |
||
| 280 | |||
| 281 | } |
||
| 282 |
In PHP, under loose comparison (like
==, or!=, orswitchconditions), values of different types might be equal.For
stringvalues, the empty string''is a special case, in particular the following results might be unexpected: