Abstracte functies in een class
stel ik heb de volgende class
Code (php)
zoals je ziet heb ik de methode getUserStatus() niet ingevuld want dit gaat de subklasse doen.
Code (php)
Is mijn denkwijze zo goed of is dit verkeerd gedacht?
Hoe denk je dit te gaan toepassen? Ik ken 'm eigenlijk alleen maar andersom dmv extends...
1) Je kan nu geen User objects meer hebben, dat is niet echt handig. Ik zou hem dus Person noemen ofzo.
2) Ik zou met levels gaan werken
3) Maak er een settertje van en sla die op een property zodat je hem altijd makkelijk kunt opvragen met een getter
4) functies hoef je niet weer opnieuw te declareren
5) Gebruik parent::functieNaam() als je de parent functie wilt gebruiken met nog wat speciaals
6) De $this->username op regel 8 van de Admin slaat hem nu niet op in de private var van User, maar in een public var van Admin.
In het totaal zou ik het zoiets maken:
Code (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
abstract class Person
{
private $name; // het is al een user dus username vind ik dan altijd overbodig
protected $level;
const LEVEL_GUEST = 1;
const LEVEL_USER = 2;
const LEVEL_MOD = 4;
const LEVEL_ADMIN = 8;
public function __construct($name)
{
$this->setName($name);
$this->setLevel(); // wordt ingevuld door de subklasse
}
public function setName($name)
{
$this->name = ucwords(strtolower($name));
}
public function getLevel()
{
return $this->level;
}
abstract protected function setLevel();
}
class User extends Person
{
protected function setLevel()
{
$this->level = Person::LEVEL_USER;
}
}
class Admin extends Person
{
private $id;
public function __construct($name, $id)
{
parent::__construct($name);
$this->setId($id);
}
public function setId($id)
{
$this->id = $id;
}
protected function setLevel()
{
$this->level = PERSON::LEVEL_ADMIN;
}
}
?>
abstract class Person
{
private $name; // het is al een user dus username vind ik dan altijd overbodig
protected $level;
const LEVEL_GUEST = 1;
const LEVEL_USER = 2;
const LEVEL_MOD = 4;
const LEVEL_ADMIN = 8;
public function __construct($name)
{
$this->setName($name);
$this->setLevel(); // wordt ingevuld door de subklasse
}
public function setName($name)
{
$this->name = ucwords(strtolower($name));
}
public function getLevel()
{
return $this->level;
}
abstract protected function setLevel();
}
class User extends Person
{
protected function setLevel()
{
$this->level = Person::LEVEL_USER;
}
}
class Admin extends Person
{
private $id;
public function __construct($name, $id)
{
parent::__construct($name);
$this->setId($id);
}
public function setId($id)
{
$this->id = $id;
}
protected function setLevel()
{
$this->level = PERSON::LEVEL_ADMIN;
}
}
?>
Aaah dat ziet er goed uit Wouter. Alleen heb ik ooit is gelezen dat het volgende afgeraden werd. PARENT:: afgeraden werd.. hoe zit dit precies als het al zo is? of is dit in sommige gevallen bijvoorbeeld?