Mm, ja dat is waar. Dat kwam eigenlijk terug in les 2

SchizoDuckie schreef op woensdag 06 februari 2008 @ 00:29:
[...]
Zegguh wil je mij en andere personen hun basiskennis van OO theorie even niet door de war schoppen?

Je had zelfs mij even in

mode met je eerste voorbeeld. Parent/child relaties werken met references, niet d.m.v. het extenden van een object (er is namelijk geen parent
instance maar een parent
class in jouw eerste voorbeeld.
De php manual spreekt van:
extends
[...]
The inherited methods and members can be overridden, unless the parent class has defined a method as final, by redeclaring them with the same name defined in the parent class. It is possible to access the overridden methods or static members by referencing them with parent::
Er is in de klasse gewoon sprake van een parent klasse. Dus waarom zou je niet van die relatie kunnen spreken? Er is dmv een extend toch een relatie tussen a en b gezegd (of ga ik hier nu de mist in

).
Verder geeft php dit voorbeeld voor het extenden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class SimpleClass
{
// member declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}
class ExtendClass extends SimpleClass
{
// Redefine the parent method
function displayVar()
{
echo "Extending class\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar(); |
code:
1
2
| Extending class
a default value |
Daar zit imho niet bijzonder veel verschil in.
Overigens, om terug te komen op de TS, je kunt nog overwegen om je switchboard class een singleton te maken als dit een soort van globale 'manager' is, en je maar 1 instance hebt. Voordeel daaraan is dat je code overzichtelijker en meer zichzelf beschrijvend wordt (ipv $this->parent heb je nu gelijk de class name voor je neus):
PHP:
1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
| class Switchboard {
public voltage;
public $frequency;
private $generators = array();
private $consumers = array();
public function __construct(){
$this->voltage = 100;
$this->frequency = 220;
}
public static function getInstance(){
static $instance;
if (!isset($instance)) {
$c = __CLASS__;
$instance = new $c;
}
return $instance;
}
function addCunsumer($label){
$newCunsumer= new Cunsumer($label);
$this->consumers[] = $newCunsumer;
return $newCunsumer ;
}
}
// generator is ff niet nodig voor demo
class Consumer{
private $label;
function __construct($label='undefined'){
$this->label = $label;
}
function display() {
return $this->label.': '.SwitchBoard::getInstance()->voltage;
}
}
$consumer = SwitchBoard::getInstance->addConsumer('test dingetje');
echo $consumer->display(); |
Sowieso moet je singletons wel uitleggen dat er maar een instance van mogelijk is. Het is niet toevallig handig als je maar een instance gebruikt, er mag maximaal maar een instance zijn.
Verder kan je (als je niet heel moeilijk wil doen), ook $this->parent vervangen door $this->switchboard, als je er erg over struikelt.
Wat je op deze manier dus ook kunt doen, is als je van meerdere types elk een switchboard hebt, deze extenden van switchboard, en die zou je dan gelijk vanuit bijv. bij het aanmaken van een nieuwe Generator bij elkaar kunnen rapen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| // we gaan even verder met de code van hierboven
class OverloadedSwitchboard extends Switchboard {
function __ construct(){
$this->voltage = 8000;
$this->frequency = 1800;
}
}
class Generator extends Consumer{
function display(){
return $this->label.':'.SwitchBoard::getInstance()->voltage. ' - '.OverloadedSwitchboard::getInstance()->voltage;
}
}
$generator = new Generator('vwalla: ');
echo $generator->display(); |
Is dit (een singleton trouwens ook) niet gewoon compleet overrated voor het simpele voorbeeld uit de TS?