Inheritance
Inheritance (overerving) is het hele "x extends y"-verhaal. Je hebt parents en children. De vraag nu dus is hoe je dat nou goed hanteert. Dat leg ik hier uit.
Vaak is een object ook een ander object. Zo is het object PHPerik ook een object Mens. Mens is ook een Dier en Dier is ook een Organisme. In PHP zeg je dan eigenlijk: PHPerik extends Mens ... Mens extends Dier ... Dier extends Organisme.
Nu is de PHPerikregel: je mag alleen extenden "als X ook een Y is". Dus als je dat letterlijk kan zeggen, dan mag het, en anders niet.
Vb:
- MySQL extends Database -> mag, want MySQL is ook een Database
- MySQLQuery extends MySQL -> mag niet, want MySQLQuery is geen MySQL. Je mag wel een MySQLQuery-object maken, maar hij mag MySQL niet extenden. Als je dan gezeik krijgt met variabelen (zoals databaseconnection) die je moet hebben in MySQLQuery, dan zit er ergens een fout in je ontwerp. Connecties kun je gewoon doorgeven aan een class, want een connectie is op zichzelf alweer een object.
- Formulier extends DOMElement -> dit hangt er heel erg van af of je hier puur het HTML-element <form> bedoelt of dat je de technische representatie van een formulier bedoeld (zoals de data of functionaliteit).
- Konijn extends Dier -> mag
- Dier extends Organisme -> mag
- Konijn extends Organisme -> mag ook
- Dier extends Konijn -> mag niet
Dag extends Maand?
Een dag kan nooooit een maand extenden. Zie de PHPerikregel: "Is een dag ook een maand?" -> nee!. Dus je kan 'm absoluut niet extenden. Stel dat je een class Maand maakt dan bevat die class wel een array met allemaal Dag-objecten. Want een maand bevat wèl meerdere dagen. Maar een dag is geen maand.
Wat wel zou kunnen is: "Januari extends Maand". Januari is namelijk wèl een maand.
Voorbeeldje hoe je Dag-objecten in je Maand-object zouden kunnen zitten:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Month
{
const JANUARY = 1;
// etc
const AUGUST = 8;
const $monthdays = array(1 => 31, 2 => 28, etc); // date() kan ook
protected $days = array(); // array met Day-objecten, voor elke dag één
public function __construct($month)
{
// kijk hoeveel dagen $month (in dit geval augustus)
// heeft en maak (in dit geval 31) Day-objecten
$this->makeDays( $this->monthdays[$month] );
}
protected function makeDays($amount)
{
for ($i = 1; $i <= $amount; $i++) {
$day = new Day($i);
$this->days[$i] = $day;
}
}
}
$month = new Month(Month::AUGUST); // of gewoon new Month(8)
?>