Object Oriented Programming in PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Albert de Wit

Albert de Wit

09/03/2012 09:41:04
Quote Anchor link
Hallo,

Ten eerste: Ik weet niet zeker of dit wel op de goede plek in het forum staat.

Mijn vraag is: Zijn er mensen hier die erg goed zijn in Object Oriented PHP? Zoja, ik wil graag een verzoek maken tot het creeren van een aantal erg handige tutorials. OOP is een groot deel van PHP geworden de laatste jaren en de meeste mensen (zoals ik onder andere) snappen het niet helemaal. Er staan wel een paar basic tutorials over OOP maar na die te hebben gevolgd snap ik het nog steeds niet.
Dus..... ik zou het heel erg zeer op prijs stellen als er een paar meer tutorials volgen over OOP. Vooral verschillende die eigenlijk op hetzelfde slaan zodat ik het ook van een andere kant zie.

Nogmaals... zou iemand mij (en zeer waarschijnlijk anderen) uit de shit willen helpen?

Een wanhopige (halve) PHPer
Gewijzigd op 09/03/2012 09:41:44 door Albert de Wit
 
PHP hulp

PHP hulp

22/12/2024 09:51:44
 
Ozzie PHP

Ozzie PHP

09/03/2012 09:50:15
 
Albert de Wit

Albert de Wit

09/03/2012 09:55:02
Quote Anchor link
Bedankt Ozzie voor je reactie maar dit is niet echt iets wat ik bedoel.
 
Ozzie PHP

Ozzie PHP

09/03/2012 09:58:38
Quote Anchor link
Kun je dan wat duidelijker zijn wat je bedoelt? Er zijn al heel veel tutorials. Wat snap je niet, wat wil / zoek je?
 
Albert de Wit

Albert de Wit

09/03/2012 10:08:27
Quote Anchor link
Ik zoek eigenlijk een serie tutorials van OOP.

Het leren van php deed ik niet door te leren wat alles betekende maar door dingen te maken in php. Dat is de meest makkelijke manier.

Ik zoek een series tutorials die beginnen met een klein projectje dat verder in de tutorials groter en uitgebreider word.
 
Tom Swinkels

Tom Swinkels

09/03/2012 11:47:53
Quote Anchor link
Op Webdevils staan diverse goede artikelen.
Ook een aanrader voor anderen.
Ook word hier uitgelegd in 12 stappen hoe je een gastenboek kunt maken in OO
Bron: https://webdevils.nl/articles/tags/oop/
 
Albert de Wit

Albert de Wit

09/03/2012 12:17:09
Quote Anchor link
Hartstikke bedankt! Dit is precies wat ik bedoelde!
 
Wouter J

Wouter J

09/03/2012 14:41:28
Quote Anchor link
Kijk ook eens rond op het oop forum onderdeel van deze site, mensen als Pim en Jelmer zijn zeer gedreven in OO en geven hele mooie en leerzame voorbeelden.
 
Albert de Wit

Albert de Wit

12/03/2012 08:34:57
Quote Anchor link
Ik vind dit nog steeds moeilijk. Kan iemand een vergelijking geven? Bijvoorbeeld een soort rekenmachine ofzo? Eerst in spaghetti PHP en dan één in Object Oriented PHP.
 
Kris Peeters

Kris Peeters

12/03/2012 13:05:10
Quote Anchor link
(een poging ...)

Om te beginnen, het is niet omdat het niet OOP is, dat het spaghetticode is. Zoek de term maar eens op op Wikipedia of zo

Het basisidee is om niet zomaar variabelen los te gebruiken.
In plaats groepeer je die dingen in objecten. Alles wat eigen is aan zo'n object, blijft bij dat object.

Ook wat functies betreft: dingen die je wil doen met zo'n object, groepeer je in de class.
neem nu als voorbeeld vogels en varkens ...

De class Vogel zou een functie ->vlieg() kunnen hebben; de class varken niet.
De class Varken kan dan weer een functie ->zoog() hebben.

Dit maakt dat je buiten de class ( waar je de class gebruikt, en dus met objecten werkt ) heel abstract en conceptueel kan werken.
Het is dan aan de class om die functies juist te verwerken.

Bekijk dit voorbeeld eens
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

// Bibliotheek-object
$albertina = new Bibliotheek();

// een aantal Mens-objecten
$jan = new Mens();
$piet = new Mens();
$jos = new Mens();

// een aantal Boek-objecten
$kartonnen_dozen = new Boek();
$de_avonden = new Boek();


// eigenschappen toevoegen aan de objecten
$jan->setGeboortedatum('1980-05-21');
$jan->setTelefoonnummer('06/123456');

$kartonnen_dozen->setAuteur('Tom Lanoye');
$kartonnen_dozen->setTitel('Kartonnen dozen');
$kartonnen_dozen->setSchrijfjaar(1991);

$de_avonden->setAuteur('Gerard Reve');
...


//eigenschappen lezen
echo 'Piet is ' . $piet->getLeeftijd() . ' jaar oud<br/>';  // getLeeftijd() wordt door de class berekend, afhankelijk van de geboortedatum die het object bevat


// nu een voorbeeld van wat er in een bibliotheek gebeurt


$albertina->boekUitlenen($jan, $kartonnen_dozen); // Jan leent het boek "Kartonnen dozen"
$albertina->boekTerugbrengen($piet, $de_avonden); // Piet brengt het boek "De avonden" terug
$albertina->setNieuwLid($jos);                    // De bibliotheek schrijft Jos in als nieuw lid.
...
$albertina->setZwarteLijst($jan, true); // Jan wordt op een zwarte lijst gezet omdat hij "Kartonnen Dozen" maar niet wil teruggeven

?>


Kijk toch nog eens heel goed naar deze link (die je al kreeg):
http://www.phphulp.nl/php/tutorial/overig/oop-beginnershandleiding-php5/701/
Gewijzigd op 12/03/2012 13:06:19 door Kris Peeters
 
Wouter J

Wouter J

12/03/2012 13:34:33
Quote Anchor link
@Kris, je zou het nog iets beter kunnen doen en een Mens klasse kunnen maken van de Auteur, maar dan ben je misschien iets te ver bezig voor albert. Verder geweldige uitleg van het procedurele gedeelte in OO!

@Albert, ik denk dat je Flat PHP bedoelt i.p.v. spaghetti PHP. Spaghetti PHP is namelijk de totaal onoverzichtelijke, slechte en onbruikbare code die beginners vaak schrijven. Flat/Procedurele PHP is het schrijven zonder klassen en OO is het schrijven in klassen.
 
Albert de Wit

Albert de Wit

15/03/2012 10:03:44
Quote Anchor link
ik was eigenlijk op zoek naar een LOGISCH voorbeeld.

zoiets als 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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
 
class Member
{
  public $username = "";
  private $loggedIn = false;
 
  public function login() {
    $this->loggedIn = true;
  }

 
  public function logout() {
    $this->loggedIn = false;
  }

 
  public function isLoggedIn() {
    return $this->loggedIn;
  }
}

 
$member = new Member();
$member->username = "Fred";
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
$member->login();
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
$member->logout();
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
 
?>
 
Joris van Rijn

Joris van Rijn

24/03/2012 00:22:52
Quote Anchor link
Albert, je moet een beetje openstaan voor de uitleg die mensen hier op het forum geven. De uitleg van Kris is het beste wat je hier kan op het internet kan krijgen! Het is 1) persoonlijk aan jou gericht en 2) van goede kwaliteit.
 
Albert de Wit

Albert de Wit

24/03/2012 10:34:06
Quote Anchor link
Dat snap ik. Ik moet alleen even de manier van denken omslaan. Ik ben OOP totaal niet gewend en ook het denkniveau is anders
 
- Raoul -

- Raoul -

24/03/2012 13:38:32
Quote Anchor link
OOP moet je zien als objecten, dus een object Huis, Computer, noem maar op. Als je dat snapt, ga dan verder.
 
Wouter J

Wouter J

24/03/2012 17:35:13
Quote Anchor link
In OOP heb je 2 basis regels:
1. Alles is een object.
Alles moet je zien als een object. Voorbeelden van objecten, user, admin, post, blogpost, topic, enz.
Al deze objecten hebben eigenschappen. Een user bijv. een naam, leeftijd, enz. en een post bijv. een titel, content, publishDate, author, enz.
Deze eigenschappen worden ingevuld en veranderd doormiddel van methods. Denk bijv. aan User->getName(), Post->setTitle('Een leuke titel'), enz.

2. Objecten en methods mogen maar 1 functionaliteit hebben
Een object, maar ook een method, mag niet meerdere dingen doen. Een user object mag bijv. niet en het vast houden van informatie voor gebruik en het in-/uitloggen regelen. Voor het in-/uitloggen heb je weer andere methods nodig.

Een voorbeeld van een veel te simpel en zeker niet te gebruiken User system, waarbij je kennis maakt met het OO denken: (ik ga er wel vanuit dat je de OO syntax kent en de OOP beginnershandleiding hebt gelezen)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
// een normale gebruiker
class User
{
  protected $name;
  protected $age;
  protected $id;
  protected $rank; // of het een moderator, normale user, enz. is

  // maak een nieuwe user

  public function __construct( $name, $age )
  {

    $this->name = (string) $name;
    $this->age = (int) $age;
    $this->setRank(); // een laat de rank zetten
  }

  // setters
  public function setId( $id )
  {

    $this->id = (int) $id;
  }

  // deze method mogen we niet vanuit buiten bereiken
  protected function setRank()
  {

    $this->rank = 1; // een normale user
  }

  // getters
  public function getName()
  {

    return $this->name;
  }

  public function getAge()
  {

    return $this->name;
  }

  public function getId()
  {

    return $this->id;
  }

  public function getRank()
  {

    return $this->rank;
  }
}

// een uitbereiding op de user klasse: een admin
class Admin extends User
{
  // we veranderen de setRank method zo dat we een hogere rank krijgen als admin
  public function setRank()
  {

    $this->rank = 5;
  }
}


class UserMapper
{
  protected static $db = new PDO(...);

  // log een user in
  static function login( User $user )
  {

    $uQuery = "UPDATE users SET login = 1 WHERE id = :id";
    $stmt = self::$db->prepare($uQuery);
    $stmt->execute(array(':id' => $user->getId()));
  }


  // of log hem uit
  static function logout( User $user )
  {

    $uQuery = "UPDATE users SET login = 0 WHERE id = :id";
    $stmt = self::$db->prepare($uQuery);
    $stmt->execute(array(':id' => $user->getId()));
  }


  // krijg een user
  public function getById( $id )
  {

    $sQuery = "SELECT name, YEAR(dateofbirth) FROM users WHERE id = ?";
    $stmt = self::$db->prepare($sQuery);
    $stmt->execute($id);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $u = new User($result['name'], (date('Y') - $result['dateofbirth']));
    $u->setId($id);

    return $u;
  }


  // ...
  // bouw het op met bijv. UserMapper::save() en UserMapper:create()

}

/*
 * Het gebruik
 */

$albert = UserMapper::getById(1); // haal de gebruiker met id=1 op
$albert->getName(); // Albert de Wit
$albert->getRank(); // 5 => het is een admin

UserMapper::login($albert); // log albert in

$peter = new User('Peter W', 25);
UserMapper::create($peter); // maak een nieuwe user (deze functie zit er nu nog niet in

UserMapper::logout($albert); // log Albert uit
?>
 
Henk Verhoeven

Henk Verhoeven

27/11/2012 13:12:23
Quote Anchor link
Sorry, ik had niet gezien hoe lang geleden deze vraag is gesteld. Helaas ik er geen annuleren knop.
Gewijzigd op 27/11/2012 13:14:51 door Henk Verhoeven
 



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.