Complex classes like SimpleMail often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use SimpleMail, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
33 | class SimpleMail |
||
34 | { |
||
35 | /** |
||
36 | * @var int $_wrap |
||
37 | */ |
||
38 | protected $_wrap = 78; |
||
39 | |||
40 | /** |
||
41 | * @var array $_to |
||
42 | */ |
||
43 | protected $_to = array(); |
||
44 | |||
45 | /** |
||
46 | * @var string $_subject |
||
47 | */ |
||
48 | protected $_subject; |
||
49 | |||
50 | /** |
||
51 | * @var string $_message |
||
52 | */ |
||
53 | protected $_message; |
||
54 | |||
55 | /** |
||
56 | * @var array $_headers |
||
57 | */ |
||
58 | protected $_headers = array(); |
||
59 | |||
60 | /** |
||
61 | * @var string $_parameters |
||
62 | */ |
||
63 | protected $_params; |
||
64 | |||
65 | /** |
||
66 | * @var array $_attachments |
||
67 | */ |
||
68 | protected $_attachments = array(); |
||
69 | |||
70 | /** |
||
71 | * @var string $_uid |
||
72 | */ |
||
73 | protected $_uid; |
||
74 | |||
75 | /** |
||
76 | * Named constructor. |
||
77 | * |
||
78 | * @return static |
||
79 | */ |
||
80 | public static function make() |
||
84 | 38 | ||
85 | /** |
||
86 | * __construct |
||
87 | * |
||
88 | * Resets the class properties. |
||
89 | */ |
||
90 | public function __construct() |
||
94 | |||
95 | 38 | /** |
|
96 | 38 | * reset |
|
97 | 38 | * |
|
98 | 38 | * Resets all properties to initial state. |
|
99 | 38 | * |
|
100 | 38 | * @return self |
|
101 | 38 | */ |
|
102 | 38 | public function reset() |
|
114 | 4 | ||
115 | /** |
||
116 | 4 | * setTo |
|
117 | 4 | * |
|
118 | * @param string $email The email address to send to. |
||
119 | * @param string $name The name of the person to send to. |
||
120 | * |
||
121 | * @return self |
||
122 | */ |
||
123 | public function setTo($email, $name) |
||
128 | |||
129 | 2 | /** |
|
130 | * getTo |
||
131 | * |
||
132 | * Return an array of formatted To addresses. |
||
133 | * |
||
134 | * @return array |
||
135 | */ |
||
136 | public function getTo() |
||
140 | |||
141 | 3 | /** |
|
142 | 3 | * setFrom |
|
143 | 3 | * |
|
144 | 3 | * @param string $email The email to send as from. |
|
145 | * @param string $name The name to send as from. |
||
146 | * |
||
147 | * @return self |
||
148 | */ |
||
149 | public function setFrom($email, $name) |
||
154 | 1 | ||
155 | /** |
||
156 | * setCc |
||
157 | * |
||
158 | * @param array $pairs An array of name => email pairs. |
||
159 | * |
||
160 | * @return self |
||
161 | */ |
||
162 | public function setCc(array $pairs) |
||
166 | 3 | ||
167 | 3 | /** |
|
168 | * setBcc |
||
169 | * |
||
170 | * @param array $pairs An array of name => email pairs. |
||
171 | * |
||
172 | * @return self |
||
173 | */ |
||
174 | public function setBcc(array $pairs) |
||
178 | |||
179 | /** |
||
180 | * setReplyTo |
||
181 | * |
||
182 | * @param string $email |
||
183 | * @param string $name |
||
184 | * |
||
185 | * @return self |
||
186 | */ |
||
187 | public function setReplyTo($email, $name = null) |
||
191 | 3 | ||
192 | 3 | /** |
|
193 | 3 | * setHtml |
|
194 | 3 | * |
|
195 | 3 | * @return self |
|
196 | 3 | */ |
|
197 | 3 | public function setHtml() |
|
203 | |||
204 | /** |
||
205 | * setSubject |
||
206 | * |
||
207 | * @param string $subject The email subject |
||
208 | 3 | * |
|
209 | * @return self |
||
210 | 3 | */ |
|
211 | 3 | public function setSubject($subject) |
|
218 | |||
219 | /** |
||
220 | * getSubject function. |
||
221 | * |
||
222 | * @return string |
||
223 | */ |
||
224 | public function getSubject() |
||
228 | 3 | ||
229 | /** |
||
230 | * setMessage |
||
231 | * |
||
232 | * @param string $message The message to send. |
||
233 | * |
||
234 | * @return self |
||
235 | */ |
||
236 | public function setMessage($message) |
||
241 | |||
242 | 3 | /** |
|
243 | 3 | * getMessage |
|
244 | 3 | * |
|
245 | * @return string |
||
246 | */ |
||
247 | public function getMessage() |
||
251 | |||
252 | /** |
||
253 | * addAttachment |
||
254 | * |
||
255 | 1 | * @param string $path The file path to the attachment. |
|
256 | * @param string $filename The filename of the attachment when emailed. |
||
257 | 1 | * @param null $data |
|
258 | 1 | * |
|
259 | 1 | * @return self |
|
260 | */ |
||
261 | 1 | public function addAttachment($path, $filename = null, $data = null) |
|
272 | 2 | ||
273 | /** |
||
274 | 2 | * getAttachmentData |
|
275 | * |
||
276 | * @param string $path The path to the attachment file. |
||
277 | * |
||
278 | * @return string |
||
279 | */ |
||
280 | public function getAttachmentData($path) |
||
288 | 1 | ||
289 | 1 | /** |
|
290 | * addMailHeader |
||
291 | * |
||
292 | * @param string $header The header to add. |
||
293 | * @param string $email The email to add. |
||
294 | * @param string $name The name to add. |
||
295 | * |
||
296 | * @return self |
||
297 | 1 | */ |
|
298 | public function addMailHeader($header, $email, $name = null) |
||
304 | |||
305 | /** |
||
306 | * addMailHeaders |
||
307 | * |
||
308 | * @param string $header The header to add. |
||
309 | 2 | * @param array $pairs An array of name => email pairs. |
|
310 | * |
||
311 | 2 | * @return self |
|
312 | 2 | */ |
|
313 | 1 | public function addMailHeaders($header, array $pairs) |
|
331 | |||
332 | /** |
||
333 | * addGenericHeader |
||
334 | * |
||
335 | * @param string $header The generic header to add. |
||
336 | 4 | * @param mixed $value The value of the header. |
|
337 | * |
||
338 | 4 | * @return self |
|
339 | */ |
||
340 | public function addGenericHeader($header, $value) |
||
349 | 2 | ||
350 | 2 | /** |
|
351 | * getHeaders |
||
352 | 2 | * |
|
353 | * Return the headers registered so far as an array. |
||
354 | * |
||
355 | * @return array |
||
356 | */ |
||
357 | public function getHeaders() |
||
361 | |||
362 | 1 | /** |
|
363 | 1 | * setAdditionalParameters |
|
364 | 1 | * |
|
365 | 1 | * Such as "[email protected] |
|
366 | 1 | * |
|
367 | 1 | * @param string $additionalParameters The addition mail parameter. |
|
368 | 1 | * |
|
369 | 1 | * @return self |
|
370 | 1 | */ |
|
371 | public function setParameters($additionalParameters) |
||
376 | 1 | ||
377 | /** |
||
378 | * getAdditionalParameters |
||
379 | * |
||
380 | * @return string |
||
381 | */ |
||
382 | public function getParameters() |
||
386 | 1 | ||
387 | /** |
||
388 | 1 | * setWrap |
|
389 | 1 | * |
|
390 | * @param int $wrap The number of characters at which the message will wrap. |
||
391 | 1 | * |
|
392 | 1 | * @return self |
|
393 | 1 | */ |
|
394 | 1 | public function setWrap($wrap = 78) |
|
403 | |||
404 | /** |
||
405 | * getWrap |
||
406 | * |
||
407 | * @return int |
||
408 | */ |
||
409 | 3 | public function getWrap() |
|
413 | |||
414 | 3 | /** |
|
415 | 1 | * hasAttachments |
|
416 | * |
||
417 | 1 | * Checks if the email has any registered attachments. |
|
418 | * |
||
419 | * @return bool |
||
420 | 2 | */ |
|
421 | 1 | public function hasAttachments() |
|
425 | |||
426 | /** |
||
427 | 2 | * assembleAttachment |
|
428 | * |
||
429 | * @return string |
||
430 | */ |
||
431 | public function assembleAttachmentHeaders() |
||
439 | |||
440 | /** |
||
441 | * assembleAttachmentBody |
||
442 | * |
||
443 | * @return string |
||
444 | */ |
||
445 | 1 | public function assembleAttachmentBody() |
|
463 | 6 | ||
464 | 6 | /** |
|
465 | 1 | * getAttachmentMimeTemplate |
|
466 | * |
||
467 | 5 | * @param array $attachment An array containing 'file' and 'data' keys. |
|
468 | 5 | * |
|
469 | * @return string |
||
470 | */ |
||
471 | public function getAttachmentMimeTemplate($attachment) |
||
487 | |||
488 | /** |
||
489 | * send |
||
490 | * |
||
491 | * @return boolean |
||
492 | * @throws \RuntimeException on no 'To: ' address to send to. |
||
493 | */ |
||
494 | 8 | public function send() |
|
514 | |||
515 | /** |
||
516 | * debug |
||
517 | * |
||
518 | * @return string |
||
519 | */ |
||
520 | public function debug() |
||
524 | |||
525 | /** |
||
526 | 12 | * magic __toString function |
|
527 | * |
||
528 | * @return string |
||
529 | 12 | */ |
|
530 | 12 | public function __toString() |
|
534 | 12 | ||
535 | /** |
||
536 | 12 | * formatHeader |
|
537 | 12 | * |
|
538 | 12 | * Formats a display address for emails according to RFC2822 e.g. |
|
539 | 12 | * Name <[email protected]> |
|
540 | * |
||
541 | * @param string $email The email address. |
||
542 | * @param string $name The display name. |
||
543 | * |
||
544 | * @return string |
||
545 | */ |
||
546 | public function formatHeader($email, $name = null) |
||
555 | |||
556 | 10 | /** |
|
557 | 10 | * encodeUtf8 |
|
558 | 10 | * |
|
559 | 10 | * @param string $value The value to encode. |
|
560 | 10 | * |
|
561 | 10 | * @return string |
|
562 | 10 | */ |
|
563 | 10 | public function encodeUtf8($value) |
|
571 | |||
572 | /** |
||
573 | * encodeUtf8Word |
||
574 | * |
||
575 | * @param string $value The word to encode. |
||
576 | * |
||
577 | * @return string |
||
578 | */ |
||
579 | public function encodeUtf8Word($value) |
||
583 | 9 | ||
584 | /** |
||
585 | * encodeUtf8Words |
||
586 | * |
||
587 | * @param string $value The words to encode. |
||
588 | * |
||
589 | * @return string |
||
590 | */ |
||
591 | 3 | public function encodeUtf8Words($value) |
|
600 | |||
601 | /** |
||
602 | * filterEmail |
||
603 | * |
||
604 | 3 | * Removes any carriage return, line feed, tab, double quote, comma |
|
605 | * and angle bracket characters before sanitizing the email address. |
||
606 | 3 | * |
|
607 | 1 | * @param string $email The email to filter. |
|
608 | * |
||
609 | 2 | * @return string |
|
610 | */ |
||
611 | public function filterEmail($email) |
||
626 | |||
627 | 1 | /** |
|
628 | * filterName |
||
629 | 1 | * |
|
630 | * Removes any carriage return, line feed or tab characters. Replaces |
||
631 | * double quotes with single quotes and angle brackets with square |
||
632 | * brackets, before sanitizing the string and stripping out html tags. |
||
633 | * |
||
634 | * @param string $name The name to filter. |
||
635 | * |
||
636 | * @return string |
||
637 | */ |
||
638 | public function filterName($name) |
||
655 | |||
656 | /** |
||
657 | * filterOther |
||
658 | * |
||
659 | * Removes ASCII control characters including any carriage return, line |
||
660 | * feed or tab characters. |
||
661 | * |
||
662 | * @param string $data The data to filter. |
||
663 | * |
||
664 | * @return string |
||
665 | */ |
||
666 | public function filterOther($data) |
||
670 | |||
671 | /** |
||
672 | * getHeadersForSend |
||
673 | * |
||
674 | * @return string |
||
675 | */ |
||
676 | public function getHeadersForSend() |
||
683 | |||
684 | /** |
||
685 | * getToForSend |
||
686 | * |
||
687 | * @return string |
||
688 | */ |
||
689 | public function getToForSend() |
||
696 | |||
697 | /** |
||
698 | * getUniqueId |
||
699 | * |
||
700 | * @return string |
||
701 | */ |
||
702 | public function getUniqueId() |
||
706 | |||
707 | /** |
||
708 | * getWrapMessage |
||
709 | * |
||
710 | * @return string |
||
711 | */ |
||
712 | public function getWrapMessage() |
||
716 | } |
||
717 |
Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.
Let’s take a look at an example:
As you can see in this example, the array
$myArray
is initialized the first time when the foreach loop is entered. You can also see that the value of thebar
key is only written conditionally; thus, its value might result from a previous iteration.This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.