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 | } |