Abstracte functies in een class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Reshad F

Reshad F

25/11/2012 18:55:37
Quote Anchor link
Hello, voor de OOP Guru's hier weer een vraagje :)

stel ik heb de volgende class

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

abstract class User {

  private $username;

  public function __construct($name) {
    $this->username = $name;
  }


  public function getUsername() {
    return $this->username;
  }


  public abstract function getUserStatus();

}


?>


zoals je ziet heb ik de methode getUserStatus() niet ingevuld want dit gaat de subklasse doen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

class Admin extends User  {

    private $adminId;
    
    public function __construct($username, $id) {
        $this->username = $username;
        $this->adminId = $id;
    }


    public function getUsername() {
    return $this->username;
    }

    
    public function getUserStatus() {
        return 'admin';
    }

}


?>


Is mijn denkwijze zo goed of is dit verkeerd gedacht?
 
PHP hulp

PHP hulp

28/11/2024 13:33:26
 
Crispijn -

Crispijn -

25/11/2012 19:08:18
Quote Anchor link
Volgens mij hoef je daar dus niet weer opnieuw de getUsername te definieren want die komt al vanuit het User object. Deze verlengt het eigenlijk alleen maar omdat het een admin is.

Hoe denk je dit te gaan toepassen? Ik ken 'm eigenlijk alleen maar andersom dmv extends...
 
Wouter J

Wouter J

25/11/2012 19:28:03
Quote Anchor link
De gedachte is goed, al zou het wel wat mooier kunnen:
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
}

?>
 
Reshad F

Reshad F

25/11/2012 20:18:15
Quote Anchor link
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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.