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 namespace Propaganistas\LaravelPhone; |
||
| 19 | class PhoneNumber implements Jsonable, JsonSerializable, Serializable |
||
| 20 | { |
||
| 21 | use ParsesCountries, |
||
| 22 | ParsesFormats, |
||
| 23 | ParsesTypes; |
||
| 24 | |||
| 25 | /** |
||
| 26 | * The provided phone number. |
||
| 27 | * |
||
| 28 | * @var string |
||
| 29 | */ |
||
| 30 | protected $number; |
||
| 31 | |||
| 32 | /** |
||
| 33 | * The provided phone country. |
||
| 34 | * |
||
| 35 | * @var array |
||
| 36 | */ |
||
| 37 | protected $countries = []; |
||
| 38 | |||
| 39 | /** |
||
| 40 | * The detected phone country. |
||
| 41 | * |
||
| 42 | * @var string |
||
| 43 | */ |
||
| 44 | protected $country; |
||
| 45 | |||
| 46 | /** |
||
| 47 | * Whether to allow lenient checks (i.e. landline numbers without area codes). |
||
| 48 | * |
||
| 49 | * @var bool |
||
| 50 | */ |
||
| 51 | protected $lenient = false; |
||
| 52 | |||
| 53 | /** |
||
| 54 | * @var \libphonenumber\PhoneNumberUtil |
||
| 55 | */ |
||
| 56 | protected $lib; |
||
| 57 | |||
| 58 | /** |
||
| 59 | * Phone constructor. |
||
| 60 | * |
||
| 61 | * @param string $number |
||
| 62 | */ |
||
| 63 | 105 | public function __construct($number) |
|
| 68 | |||
| 69 | /** |
||
| 70 | * Create a phone instance. |
||
| 71 | * |
||
| 72 | * @param string $number |
||
| 73 | * @param string|array $country |
||
| 74 | * @return static |
||
| 75 | */ |
||
| 76 | 30 | public static function make($number, $country = []) |
|
| 82 | |||
| 83 | /** |
||
| 84 | * Set the country to which the phone number belongs to. |
||
| 85 | * |
||
| 86 | * @param string|array $country |
||
| 87 | * @return static |
||
| 88 | */ |
||
| 89 | 90 | public function ofCountry($country) |
|
| 100 | |||
| 101 | /** |
||
| 102 | * Format the phone number in international format. |
||
| 103 | * |
||
| 104 | * @return string |
||
| 105 | */ |
||
| 106 | 3 | public function formatInternational() |
|
| 110 | |||
| 111 | /** |
||
| 112 | * Format the phone number in national format. |
||
| 113 | * |
||
| 114 | * @return string |
||
| 115 | */ |
||
| 116 | 3 | public function formatNational() |
|
| 120 | |||
| 121 | /** |
||
| 122 | * Format the phone number in E164 format. |
||
| 123 | * |
||
| 124 | * @return string |
||
| 125 | */ |
||
| 126 | 18 | public function formatE164() |
|
| 130 | |||
| 131 | /** |
||
| 132 | * Format the phone number in RFC3966 format. |
||
| 133 | * |
||
| 134 | * @return string |
||
| 135 | */ |
||
| 136 | 6 | public function formatRFC3966() |
|
| 140 | |||
| 141 | /** |
||
| 142 | * Format the phone number in a given format. |
||
| 143 | * |
||
| 144 | * @param string $format |
||
| 145 | * @return string |
||
| 146 | * @throws \Propaganistas\LaravelPhone\Exceptions\NumberFormatException |
||
| 147 | */ |
||
| 148 | 45 | public function format($format) |
|
| 161 | |||
| 162 | /** |
||
| 163 | * Format the phone number in a way that it can be dialled from the provided country. |
||
| 164 | * |
||
| 165 | * @param string $country |
||
| 166 | * @return string |
||
| 167 | * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException |
||
| 168 | */ |
||
| 169 | 6 | View Code Duplication | public function formatForCountry($country) |
| 180 | |||
| 181 | /** |
||
| 182 | * Format the phone number in a way that it can be dialled from the provided country using a cellphone. |
||
| 183 | * |
||
| 184 | * @param string $country |
||
| 185 | * @param bool $removeFormatting |
||
| 186 | * @return string |
||
| 187 | * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException |
||
| 188 | */ |
||
| 189 | 6 | View Code Duplication | public function formatForMobileDialingInCountry($country, $removeFormatting = false) |
| 201 | |||
| 202 | /** |
||
| 203 | * Get the phone number's country. |
||
| 204 | * |
||
| 205 | * @return string |
||
| 206 | */ |
||
| 207 | 84 | public function getCountry() |
|
| 215 | |||
| 216 | /** |
||
| 217 | * Filter the provided countries to the one that is valid for the number. |
||
| 218 | * |
||
| 219 | * @param string|array $countries |
||
| 220 | * @return string |
||
| 221 | * @throws \Propaganistas\LaravelPhone\Exceptions\NumberParseException |
||
| 222 | */ |
||
| 223 | 84 | protected function filterValidCountry($countries) |
|
| 250 | |||
| 251 | /** |
||
| 252 | * Get the phone number's type. |
||
| 253 | * |
||
| 254 | * @param bool $asConstant |
||
| 255 | * @return string|int|null |
||
| 256 | */ |
||
| 257 | 18 | public function getType($asConstant = false) |
|
| 269 | |||
| 270 | /** |
||
| 271 | * Check if the phone number is of (a) given type(s). |
||
| 272 | * |
||
| 273 | * @param string $type |
||
| 274 | * @return bool |
||
| 275 | */ |
||
| 276 | 15 | public function isOfType($type) |
|
| 282 | |||
| 283 | /** |
||
| 284 | * Get the PhoneNumber instance of the current number. |
||
| 285 | * |
||
| 286 | * @return \libphonenumber\PhoneNumber |
||
| 287 | */ |
||
| 288 | 78 | public function getPhoneNumberInstance() |
|
| 292 | |||
| 293 | /** |
||
| 294 | * Determine whether the phone number seems to be in international format. |
||
| 295 | * |
||
| 296 | * @return bool |
||
| 297 | */ |
||
| 298 | 42 | protected function numberLooksInternational() |
|
| 302 | |||
| 303 | /** |
||
| 304 | * Enable lenient number parsing. |
||
| 305 | * |
||
| 306 | * @return $this |
||
| 307 | */ |
||
| 308 | 24 | public function lenient() |
|
| 314 | |||
| 315 | /** |
||
| 316 | * Convert the phone instance to JSON. |
||
| 317 | * |
||
| 318 | * @param int $options |
||
| 319 | * @return string |
||
| 320 | */ |
||
| 321 | 3 | public function toJson($options = 0) |
|
| 325 | |||
| 326 | /** |
||
| 327 | * Convert the phone instance into something JSON serializable. |
||
| 328 | * |
||
| 329 | * @return string |
||
| 330 | */ |
||
| 331 | 3 | public function jsonSerialize() |
|
| 335 | |||
| 336 | /** |
||
| 337 | * Convert the phone instance into a string representation. |
||
| 338 | * |
||
| 339 | * @return string |
||
| 340 | */ |
||
| 341 | 3 | public function serialize() |
|
| 345 | |||
| 346 | /** |
||
| 347 | * Reconstructs the phone instance from a string representation. |
||
| 348 | * |
||
| 349 | * @param string $serialized |
||
| 350 | */ |
||
| 351 | 3 | public function unserialize($serialized) |
|
| 357 | |||
| 358 | /** |
||
| 359 | * Convert the phone instance to a formatted number. |
||
| 360 | * |
||
| 361 | * @return string |
||
| 362 | */ |
||
| 363 | 9 | public function __toString() |
|
| 373 | } |