Verder gaan met OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robin Van den Broeck

Robin Van den Broeck

05/02/2012 14:27:27
Quote Anchor link
Ik heb hier de beginnershandeleiding (Lang woord =')) gelezen voor OOP maar ik zou graag verder gaan dan dat, heeft iemand nog goede tutorials die ook abstract classes etc. beter uitleggen.
 
PHP hulp

PHP hulp

29/12/2024 04:07:35
 
Wouter J

Wouter J

05/02/2012 14:32:44
Quote Anchor link
Lees eens wat reacties van Pim en Jelmer door en kijk eens in het OO forumdeel. Daar wordt vaak goede uitgebreide uitleg gegeven en probeer eens wat.

Of vraag het anders eens hier op het forum, wat begrijp je bijv. niet aan abstract classes? Ik (en andere) willen het je best uitleggen, maar dan moet het wel wat concreter zijn.
 
Robin Van den Broeck

Robin Van den Broeck

05/02/2012 14:37:22
Quote Anchor link
Ik snap niet wat het doet eerlijk gezegd. Verplichten om iets in te geven?
 
Wouter J

Wouter J

05/02/2012 14:49:11
Quote Anchor link
Stel je gaat een OO usersysteem maken. Dan heb je meerdere Users: Admin, Member, enz. Zowel de Admin als de Member krijgen zelfde methodes en zijn eigenlijk child van de User class. Deze bevat de basis methods.
Maar ze hebben ook nog verschillen, de admin kan meer en heeft andere rechten.
In dit geval zou het zoiets worden:
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
<?php
    class User
    {
      protected $name; // de naam
      protected $rank; // de rank, member = 1 admin = 2
      
      public function __construct( $name )
      {

        $this->name = $name;
        
        $this->setRank(); // deze method moet worden gemaakt in de child class
      }
      
      public function getName()
      {

        return $this->name;
      }
    }

    class Member extends User
    {
      protected function setRank()
      {

        $this->rank = 1;
      }
    }

    class Admin extends User
    {
      protected function setRank()
      {

        $this->rank = 2;
      }
    }

    
    $robin = new Member('robin');
    $robin->getName(); // robin
    
    $bas = new Admin('bas');
    $bas->getName(); // bas
?>


Dit systeem werkt leuk, alleen we zitten met 2 problemen:
1) we zouden geen user object mogen kunnen maken. Die moet eigenlijk niet bestaan.
2) we kunnen vergeten de setRank method te maken. Hierdoor kunnen we een error krijgen.

Beide problemen zijn op te lossen met een abstract class. Als we de User class abstract maken zorgen we ervoor dat we geen new User(); kunnen gebruiken. En als we nou in deze abstracte class een abstract method setRank aanmaken krijgen we een error als we die vergeten te 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
<?php
    abstract class User
    {
      protected $name; // de naam
      protected $rank; // de rank, member = 1 admin = 2
      
      public function __construct( $name )
      {

        $this->name = $name;
        
        $this->setRank(); // deze method moet worden gemaakt in de child class
      }
      
      public function getName()
      {

        return $this->name;
      }

      
      // zorg dat we verplicht zijn een setRank method te maken
      protected abstract function setRank();
    }

    
    class Admin extends User
    {
      protected function setRank()
      {

        $this->rank = 2;
      }
    }

    
    class Beheerder extends User
    {
      public function editPage()
      {

        // doe wat leuks, merk op dat we hier geen setRank method maken
        // we krijgen nu dus een error omdat deze method mist.

      }
    }

    
    $robin = new User('robin'); // error, user is abstract en kunnen we dus niet aanmaken
    $bas = new Beheerder('bas'); // werkt niet, door de error
    $erik = new Admin('erik'); // werkt goed
?>


Ik hoop dat het wat duidelijker is geworden. Een goed nut van abstract classes kun je bijv. hier vinden: http://www.phphulp.nl/php/forum/topic/de-opbouw-van-een-logging-class/81508/#577390
 
Erwin H

Erwin H

05/02/2012 14:51:44
Quote Anchor link
Simpel gezegd definieer je een functie, maar vul je het nog niet in. Dit geeft je de mogelijkheid om in de basis class wel al de functie aan te roepen, maar in een descendent class de functie pas helemaal te schrijven. Dit is handig als je al weet dat je meerdere verschillende descendents wil hebben, die allemaal hun eigen invulling eraan geven. Neem als voorbeeld een class "dier". Je kan hier een asbtracte functie in definieren "geef_geluid". Er staat nog niets in, want er is geen algemeen geluid voor alle dieren. Maar als je nu een descendent "koe" maakt dan definieer je in die class "geef_geluid" met als ech "boe" en bij de class "hond" definieer je het als echo "woef".
Omdat de functie "geef_geluid" wel in de parent is aangemaakt kan je hem daar wel aanroepen, maar wat er uitkomt is afhankelijk van de kind class die is aangemaakt.

Een meer praktisch voorbeeld is een HTML object dat ik gebruik. Mijn hoofd class maakt de HTML structuur op, maar niet de pagina. Dus wel de html, head en body tag, maar niet de rest. Het definieert wel al een functie "write_body()", maar dan abstract. Elk kind class moet die functie dus definieren, zodat ik in mijn hoofd class die functie kan aanroepen binnen de body tags, zonder verder te hoeven weten wat er dan uit zal komen.
 
Robin Van den Broeck

Robin Van den Broeck

05/02/2012 14:59:21
Quote Anchor link
Alle twee bedankt voor informatie. Ondertussen ben ik al weg met abstract classes door je voorbeelden Wouter!

Erwin: waarom zou je in godsnaam gebruik maken van PHP om een HTML pagina op de maken? (Vooral de body) Misschien een CMS maar dan werk je beter met een DB. Even om het de verduidelijken wat ik bedoel.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<!-- Gemaakt in de browser, vandaar geen whitespace. =)-->
<!doctype html>
<html lang="nl">
<head>
</head>
<body>
<?php
mysql_query("select info from table where id='$_GET['id']'"); //Query is waarschijnlijk niet juist, ik weet het. Vergeten hoe je ook alweer met get in een query werkt. =')
?>

</body>

Weet iemand nog een boek/tutorial waar er verder wordt gegaan op deze dingen. Ik neem aan dat ik nog niet alles weet van OOP na die simpele tutorial. =')
Gewijzigd op 05/02/2012 15:00:17 door Robin Van den Broeck
 
Erwin H

Erwin H

05/02/2012 15:14:43
Quote Anchor link
Robin Van den Broeck op 05/02/2012 14:59:21:
Erwin: waarom zou je in godsnaam gebruik maken van PHP om een HTML pagina op de maken? (Vooral de body) Misschien een CMS maar dan werk je beter met een DB. Even om het de verduidelijken wat ik bedoel.

Waarom?
Omdat ik vele verschillende pagina's heb die allemaal dezelfde basis layout hebben en elke keer een deel anders is. Feitelijk heb ik een basis object dat de pagina opmaakt, daarna een object dat de grote lijnen invult en tenslotte een pagina specifiek opbject dat alle pagina specifieke delen erin zet. Op die manier hoef ik niet elk HTML bestand of php (met HTML) bestand aan te passen als ik bijvoorbeeld mijn hoofd structuur van de pagina wil aanpassen. En als ik een nieuwe pagina erbij wil hebben hoef ik over een heel groot deel me geen zorgen meer te maken, want dat gaat automatisch goed.
En deze opbjecten handelen overigens niet alleen de HTML af, maar bijvoorbeeld ook welke CSS en JS bestanden geladen moeten worden.
Ik maak overigens geen gebruik van een CMS, uiteraard wel extensief van databases.

Maar uit je opmerking begrijp ik dat jij het allemaal beter weet?
 
Robin Van den Broeck

Robin Van den Broeck

05/02/2012 15:39:09
Quote Anchor link
Over dat laatste, ik snap enkel niet waarom je dat zou gebruiken. Ik vind het gewoon niet erg 'logisch' en gebruiksvriendelijk. (Toch voor mij, in ieder geval. Ik werk liever met een form en zo de pagina's opmaken. En dan nog, als jij denk dat ik toch alles beter zou weten, waarom vraag ik hier dan om raad?
Maar nu ik die informatie heb snap ik wel wat je bedoelt. Iedereen heeft zo zijn eigen manieren niet?
 
Erwin H

Erwin H

05/02/2012 15:51:29
Quote Anchor link
Als je alleen wilt weten waarom, vraag dat dan. Als je gaat zeggen "waarom zou je in godsnaam" dan blijkt daar niet echt uit dat je geinteresseerd ben in een uitleg, maar meer dat je jouw mening al hebt bepaald. Vandaar mijn laatste opmerking.
 
Pieter Jansen

Pieter Jansen

05/02/2012 16:39:58
Quote Anchor link
Je moet niet vergeten dat PHP geen volledige OO taal is, dus niet alle constructs en design patterns passen in een PHP plaatje. Zo missen er meerdere onderdelen wat OO juist OO maakt. Abstract betekent enkel dat een klasse niet volledig is, een blueprint voor z`n kinderen. Die kinderen moeten vervolgens de abstracte methodes implementeren. Dan pas kun je er een object van maken.

Een interface is ook iets soortgelijks echter heeft deze als voordeel dat je niet gelimiteerd bent aan 1 interface. Nadeel is echter dat je geen functionaliteit kunt beschrijven in een interface. Een interface heeft echter eerder als doel iets te omschrijven dat later in andere objecten gebruikt kan worden om bijvoorbeeld te laten itereren.
 
Robin Van den Broeck

Robin Van den Broeck

05/02/2012 17:08:02
Quote Anchor link
@Merijn: Een interface snap ik, het is zelfs handig. En dat PHP geen volledige OO taal is had ik zelf al door, maar toch nog eens bedankt voor de extra uitleg. =)

@Erwin: ik zal volgende keer het niet meer zeggen? Oké?

Toevoeging op 05/02/2012 17:24:19:

Wat vinden jullie van dit?
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
<?php
interface Db {
    public function connect();
    public function error();
    public function errorno();
    public function escape($string);
    public function query($query);
    public function fetchArray();
    public function fetchRow();
    public function fetchAssoc();
    public function fetchObject();
    public function numRows();
    public function close();
}

?>

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
<?php
class Mysql implements Db {
    public function connect($username,$password,$server,$database){
        mysql_connect($server, $username, $password);
        mysql_select_db($database);
    }

    public function error() {
        mysql_error();
    }

    public function errorno() {
        mysql_errorno();
    }

    public function escape($string) {
        mysql_real_escape_string($string);
    }

    public function query($query) {
        mysql_query($query);
    }

    public function fetchArray($result) {
        mysql_fetch_array($result);
    }

    public function fetchAssoc($result) {
        mysql_fetch_assoc($result);
    }

    public function fetchObject($result) {
        mysql_fetch_object($result);
    }

    public function fetchRow($result) {
        mysql_fetch_row($result);
    }

    public function close() {
        mysql_close();
    }
}

?>


Toevoeging op 05/02/2012 17:56:43:

Na wat aanpassingen:
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
<?php
interface DB {
    public function connect();
    public function error();
    public function errorno();
    public function escape($string);
    public function query($query);
    public function fetchArray($result);
    public function fetchRow($result);
    public function fetchAssoc($result);
    public function fetchObject($result);
    public function numRows($result);
    public function close();
}

?>

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
<?php
require("db.interface.php"); //Interface verkrijgen
class Mysql implements DB {
    public function connect($server,$username,$password,$database){
        mysql_connect($server, $username, $password) or die('Kan geen verbinding maken met de database server');
        mysql_select_db($database) or die('Kan de db niet selecteren.');
    }

    public function error() {
        mysql_error();
    }

    public function errorno() {
        mysql_errorno();
    }

    public function escape($string) {
        mysql_real_escape_string($string);
    }

    public function query($query) {
        mysql_query($query);
    }

    public function fetchArray($result) {
        mysql_fetch_array($result);
    }

    public function fetchAssoc($result) {
        mysql_fetch_assoc($result);
    }

    public function fetchObject($result) {
        mysql_fetch_object($result);
    }

    public function fetchRow($result) {
        mysql_fetch_row($result);
    }

    public function numRows($result) {
        mysql_num_rows($result);
    }

    public function close() {
        mysql_close();
    }
}

?>
 



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.