[OOP] Gastenboek

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lead Software Developer

De afdeling ICT is belangrijk binnen onze organisatie. Deze afdeling ontwikkelt zich steeds meer naar een flexibele, innovatieve en zakelijke organisatie, die marktconform werkt en een hoogwaardig aanbod aan diensten biedt. We kennen een grote diversiteit aan systemen (ERP, Warehouse management, Enterprise Service Bus, BI, e-commerce). Onlangs hebben we onze systemen vernieuwd. Ter versterking van deze afdeling zijn we op zoek naar een enthousiaste collega voor de functie van: Lead Software Developer (32 – 40 uur) Als Lead Software Developer geef je vakinhoudelijk leiding aan het ontwikkelteam en ben je samen met jouw teamleden verantwoordelijk voor het verder ontwikkelen van

Bekijk vacature »

PHP developer

Briljante werken-bij websites voor clubs als ABN-AMRO, T-Mobile, KWF Kankerbestrijding en Boskalis. Online recruitmentmarketingcampagnes voor Waterschap Rivierenland, Randstad en VDL Nederland. Dit zijn zomaar een paar van de projecten die we al hebben binnengeharkt. En er kan nog meer bij. Welke projecten oogst jij als PHP developer bij Getnoticed? Als PHP developer bij Getnoticed werk je in een team met acht directe collega’s. Bij ons geen hiërarchie of weken beslissingstijd. Dit betekent korte lijnen en snel schakelen. Dat is ook wel nodig bij alle innovatieve projecten waar we tegelijkertijd aan werken, zoals Google Cloud Talent Solution. Jouw functie bij Getnoticed

Bekijk vacature »

Java Software Developer

Java Software Developer - Smart Logistics Functiebeschrijving: Bouw jij de professionele applicaties die onze klanten zo hard nodig hebben? En wil je graag met de nieuwste technologieën werken binnen een DevOps scrumteam? Lees dan snel verder! Wat ga je doen? Als Java Software Developer werk je aan uitdagende projecten bij verschillende klanten en ben je altijd onderdeel van een software ontwikkelteam. Samen met je team, de product owner en de architect ben je verantwoordelijk voor het definiëren, ontwerpen, ontwikkelen, beveiligen en testen van nieuwe of bestaande applicaties binnen de logistieke sector. “Use digital to move smarter" De unit Smart Logistics

Bekijk vacature »

Azure Cloud Architect - Smart Logistics

Azure Cloud Architect - Smart Logistics Functiebeschrijving: Is Cloud jouw passie en Azure jouw expertise? Wil jij onze klanten in de logistieke sector helpen met hun digitale transformatie door het ontwerpen en implementeren van Microsoft Azure technologieën? Lees dan snel verder! Wat ga je doen? “Use digital to move smarter" De unit Smart Logistics binnen de Transport & Logistics sector van CGI ontwerpt, bouwt, beheer en onderhoudt veelal missie-kritische applicaties en data platforms die draaien in de Azure Cloud. Zonder de logistieke sector worden onze pakketjes niet op tijd afgeleverd, rijden de treinen niet meer van a naar b en

Bekijk vacature »

Full stack developer @ Rotterdam

2020-12-18 iSense Full stack developer Full Stack Developer ISRA48618 Organisatie De organisatie waarbinnen je aan de slag zal gaan levert diensten aan een groot aantal organisaties binnen Nederland. De software die zij maken en inzetten voor hun klanten wordt dagelijks door honderden klanten gebruikt. Onze opdrachtgever is marktleider in Nederland als het gaat om full-service HR-dienstverlening. De afgelopen periode is onze klant hard gegroeid en daar zijn de nodige uitdagingen bij komen kijken. Om deze groei voort te kunnen zetten zijn ze op zoek naar nieuwe vaste medewerkers, dit om ervoor te zorgen dat ze marktleider blijven. Zij zijn op

Bekijk vacature »

Web Developer (m/w/d)

Web Developer IT and Infrastructure EMBL Heidelberg Closing date: 22 October 2021 Contract duration: 4 years (project related) Grading: 6, 7 or 8; depending on experience (monthly salary starting from 3.8k€ up to 4.8k€ after tax, plus other benefits)s Reference number: HD02055 IT Services operates and supports the IT infrastructure and services at EMBL headquarters in Heidelberg and at the laboratory’s sites in Barcelona and Rome. In collaboration with the EMBL-EBI in Cambridge our team is creating and implementing a new web infrastructure for all EMBL websites. We are looking to recruit an enthusiastic Web Developer to join the Software

Bekijk vacature »

Symphony developer

Als PHP developer bij Getnoticed werk je in een team met acht directe collega’s. Bij ons geen hiërarchie of weken beslissingstijd. Dit betekent korte lijnen en snel schakelen. Dat is ook wel nodig bij alle innovatieve projecten waar we tegelijkertijd aan werken, zoals Google Cloud Talent Solution. Jouw functie bij Getnoticed is voornamelijk het bedenken van oplossingen voor klanten, hen hierin adviseren en het schrijven van koppelingen. Je hebt hier veel vrijheid maar kunt altijd bij collega’s terecht om te sparren. In een week kun je zo voor 4 á 5 verschillende klanten werken. Dit houdt je werk afwisselend. Naast

Bekijk vacature »

Front-end Developer

Introductie: Bij Yacht waarderen we onze mensen en begrijpen we wat belangrijk voor u is. Wij geloven in het optimaliseren van het potentieel door een werkomgeving te creëren waar mensen zichzelf kunnen uitdagen, de juiste ondersteuning krijgen en goede arbeidsomstandigheden hebben. Om dit te bereiken, creëren we een ‘dienstverband op maat’ dat past bij uw specifieke behoeften en ambities. Benieuwd wat wij u kunnen bieden? Ontdek dit vandaag nog. Wat je gaat doen: Wij zijn op zoek naar een Front-end voor een internationale/grote bank in Amsterdam. Deze rol is binnen een internationale IT-omgeving met een Agile/Scrum manier van werken. Deze

Bekijk vacature »

Full Stack Developer / .NET @ Zwolle

2021-03-25 iSense Full Stack Developer / .NET Ben je een gedreven .NET Developer, ontwikkel je graag in C# of VB.NET en wil je graag inspraak hebben in het gehele ontwikkeltraject, waarbij je veel verantwoordelijkheden krijgt? Werk je graag bij een informele organisatie die een hoge kwaliteit nastreeft? Reageer dan nu! ISPE49358 Organisatie Deze organisatie is gesitueerd in de omgeving van Zwolle en is actief binnen de financiële dienstverlening voor klanten. Ze is actief op twee locaties, één in de Randstad en één in het Noordoosten van het land. Voor de locatie in de regio Zwolle, waar ongeveer 35 collega's werken,

Bekijk vacature »

Solution Architect

Wil jij met experts uit verschillende disciplines samenwerken aan het digitaliseren en future-proof maken van onze betaaloplossingen? En sta je open voor internationale samenwerkingen? Dan is dit de uitdaging die bij jou past! Solution Architect Utrecht – 40 uur Jouw verantwoordelijkheden Als Solution Architect maak je deel uit van het ‘Solutions Development' team. Dit multifunctionele team bestaat uit zes professionals; deels met een IT specialisatie en deels business experts. Met jouw analyses en ontwerpen worden klantwensen en business requirements omgezet naar informatietechnologie. Je staat hiermee aan de basis van de realisatie van IT projecten, waarbij je nauw samenwerkt met de

Bekijk vacature »

Javascript Front-end Developer - Medior

We're searching for a front-end developer to help a client grow their front-end applications and improve user experiences. The front-end is solely hand made in JavaScript and therefore you need to breathe JavaScript. Job Description Our client is a medium sized specialist in email marketing. The company is characterized by an open atmosphere with a strong focus on personal development and interest. To support their growth we're searching for a front-end developer with JavaScript skills. The front-end is a single-page application developed in JavaScript that requires HTML and CSS expertise. You should also be comfortable with PHP in order to

Bekijk vacature »

Systeembeheerder VMware

Senior Systeembeheerder VMware Opleidingsbudget van € 5.000,- Onze opdrachtgevers werken met de nieuwste technieken dus onze medewerkers ook. Daarom bieden we jou uitgebreide opleidingsmogelijkheden en ondersteunen we je maximaal in je ontwikkeling. We bepalen samen met jou een opleidingstraject want niemand wil stilstaan in zijn ontwikkeling, zeker niet in de IT. Wat mag je nog meer verwachten? Direct een arbeidsovereenkomst voor onbepaalde tijd Een salaris tussen de € 4.000,- en € 4.500,- bruto per maand o.b.v. 40 uur Diverse bonussen: 1800+ uur bonus Wervingsbonus, een waardebon naar keus, ter waarde van € 1.500,- netto Een onkostenvergoeding van € 100,- netto

Bekijk vacature »

Full Stack Java Developer - Infrastructure

Ben jij een ontwikkelaar die wil bijdragen aan de applicatie ontwikkeling van klanten die zich primair bezig houden met de vitale onderdelen van Nederland, zoals transport, weg, water, spoor en gas, water en licht? Lees dan verder! Wat ga je doen? Als Full Stack Java Ontwikkelaar draag je verantwoordelijkheid voor het gehele proces van het omzetten van wensen, problemen of vragen naar concrete oplossingen. Integratie, testen, vastleggen van kennis en beslissingen, problem management en automation zijn onderdeel van je takenpakket in zowel SAFE of DevOps gestuurde omgevingen als ook in omgevingen die nog werken volgens het traditionele waterval model. Als

Bekijk vacature »

OutSystems Ontwikkelaar - Verzekeringen

OutSystems Ontwikkelaar - Verzekeringen Functiebeschrijving: Wil jij als ervaren OutSystems Ontwikkelaar aan de wieg staan van een nieuw te vormen team en jouw kennis en ervaring delen? De afgelopen jaren vraagt de markt steeds meer om snelheid bij het oplossen van business vraagstukken en adequaat op te kunnen lossen met onderliggende IT. De business wil snel in kunnen spelen op veranderingen in een veranderde markt. IT wordt vaak gezien als een vertragende component om te komen tot een oplossing. Wat ga je doen? Als OutSystems ontwikkelaar kom je te werken in een nieuw te vormen team met OutSystems specialisten. Een

Bekijk vacature »

C/C++ Developer @ Utrecht

2021-09-27 iSense C/C++ Developer Wil jij als C/C++ Developer aan verschillende (inhouse) projecten tegelijk werken voor een organisatie die door slimme oplossingen Nederland steeds leefbaarder maakt? Lees dan nu verder! ISHU48544 Organisatie Als Software ontwikkelaar C/C++ kom je te werken bij een toonaangevende organisatie in de mobiliteitsbranche die door het produceren van slimme producten Nederland steeds leefbaarder maakt! Ze ontwikkelen innovatieve producten die er onder andere voor zorgen dat de infrastructuur in Nederland op de snelste en meeste efficiënte manier kan worden geregeld. Als C/C++ ontwikkelaar kom je te werken op een afdeling met 40 collega's, bestaande uit Engineers, deskundigen

Bekijk vacature »
Roel -

Roel -

08/01/2012 17:50:29
Quote Anchor link
Hoi hoi,

Ik ben momenteel bezig met OOP maar ik blijf nog steeds ouderwets programmeren, omdat ik gewoon nog niet precies weet hoe ik OOP moet werken. Ik doe daarom veel oefeningen en nu ben ik een gastenboek aan het maken.

Ik doe dit dus op de OOP manier, en tevens gebruik ik MySQLi OOP.
Waar ik nu echter mee vastloop, is het ophalen van reacties.

Dit is m'n code:
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
<?php
class Gastenboek {

        $mysqli = new mysqli('localhost', 'root', '', 'gastenboek');
        
        public function getReacties() {
                $query = "SELECT naam, reactie FROM gastenboek ORDER BY datum DESC";
                $sql = $mysqli->query($query);
                if ($sql) {
                        
                }
        }


        public function plaatsReactie(Reactie $reactie) {
                $query = "INSERT INTO gastenboek (naam, reactie, ipadres, datum) VALUES ('".$mysqli->real_escape_string($reactie->getNaam())."', '".$mysqli->real_escape_string($reactie->getReactie())."', '".$mysqli->real_escape_string($reactie->getIP())."', NOW())";
                $sql = $mysql->query($query);
                if (!$sql) {
                        throw new Exception('De reactie kon niet toegevoegd worden!');
                }
        }
}


class Reactie {
        private $_naam, $_reactie, $_ip;
        
        public function __construct($naam, $reactie, $ip) {
                $this->_naam = $naam;
                $this->_reactie = $reactie;
                $this->_ip = $ip;
        }

        
        public function getNaam() {
                return $this->_naam;
        }

        
        public function getReactie() {
                return $this->_reactie;
        }

        
        public function getIP() {
                return $this->_ip;
        }
}

?>


Wat ik nu eigenlijk zou willen, is dat ik het volgende kan gebruiken om reacties te tonen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$gastenboek
= new Gastenboek();
while ($reactie = $gastenboek->getReacties()) {
        echo 'Naam: '.$reactie->getNaam().'<br />';
        echo 'Reactie: '.$reactie->getReactie().'<br /><br />';
}

?>


Ik heb alleen totaal geen idee hoe ik dit zou moeten oplossen. De 'Reactie' class gebruik ik voor het aanmaken van een reactie. Althans, dat was de bedoeling, maar nu schiet me net te binnen dat ik die ook zou kunnen gebruiken om reacties te tonen.

Of de code verder werkt weet ik niet, ik heb hem namelijk nog niet getest.
Ik hoop dat iemand me kan helpen!
 
PHP hulp

PHP hulp

17/10/2021 02:17:04
 
Wouter J

Wouter J

08/01/2012 17:57:08
Quote Anchor link
Je hebt bij een gastenboek te maken met meerdere objecten. Je hebt een Gastenboek, dat is al je eerste object. Dit gastenboek heeft een aantal of 1 eigenschap(pen) (properties). De eigenschap is een reactie. Dus dan heb je object 2, de reactie. Een reactie heeft als eigenschappen de User en de Content. Dat zijn dus properties, en eigenschappen, van Reactie. De User zou zelf ook nog een object kunnen zijn, maar zo ver gaan we niet.

Nu gaan we kijken, welk object moet de reactie ophalen. Moet de reactie zichzelf ophalen? Of moet het gastenboek de reactie ophalen? Of heb je een aparte class nodig om de reacties op te halen?
Gewijzigd op 08/01/2012 17:57:36 door Wouter J
 
Roel -

Roel -

08/01/2012 18:01:22
Quote Anchor link
Ik heb zelf ook al gedacht om een class aan te maken die bijvoorbeeld heet 'Reactiesgrabber', maar om hier nou een speciale class voor aan te maken lijkt me ook weer onnodig.

Maar van de andere kant, als ik die koppel aan het gastenboek ( $gastenboek->setGrabber(new Reactiegrabber()) ) zou het ook prima kunnen.

Of denk ik nu verkeerd?
 
Wouter J

Wouter J

08/01/2012 18:06:26
Quote Anchor link
Je denkt al iets te moeilijk. Overigens Reactiesgrabber, zoiets heet een Datamapper en dat is in dit geval nog veel te moeilijk.

We hebben het main object Gastenboek. Dit omvat alles. Een gastenboek heeft reacties als eigenschap en propertie. Doormiddel van methods kun je properties wijzigen. Een gastenboek kan dus reacties ophalen, toevoegen, verwijderen, bewerken, enz.

Ik schrijf het liefst altijd voordat ik begin alles uit zonder code te schrijven. Zo heb je een beeld van hoe de objecten zijn, wat ze inhouden, enz:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
ClassName
  - eigenschap
  + methode()
  + andereMethode( $var )

Hierbij is - en + de visibility, public private en protected. Probeer eens zo'n diagram te maken voor een Gastenboek waarbij je in je achterhoofd houdt dat Gastenboek reacties als eigenschap heeft en deze kan bewerken.
Gewijzigd op 08/01/2012 18:08:46 door Wouter J
 
Roel -

Roel -

08/01/2012 18:26:49
Quote Anchor link
Ik heb het met Visual Paradigm gemaakt (een tool van school).
Erg bekend met het programma ben ik nog niet, maar dat geeft niet.
http://i43.tinypic.com/1055chu.jpg

Ik heb het MySQLi gedeelte er voor nu maar even uit gehaald, want dat snap ik nog niet helemaal. Als ik dit plaatje implementeer kom ik hierop uit en dit werkt:
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 Gastenboek {

        private $_reacties = array();
        
        public function getReacties() {
                return $this->_reacties;
        }


        public function plaatsReactie(Reactie $reactie) {
                $this->_reacties[] = $reactie;
        }
}


class Reactie {
        private $_naam, $_reactie, $_ip;
        
        public function __construct($naam, $reactie, $ip = '') {
                $this->_naam = $naam;
                $this->_reactie = $reactie;
                $this->_ip = $ip;
        }

        
        public function getNaam() {
                return $this->_naam;
        }

        
        public function getReactie() {
                return $this->_reactie;
        }
}


$gastenboek = new Gastenboek();
$gastenboek->plaatsReactie(new Reactie('Roel', 'Voorbeeld'));
foreach ($gastenboek->getReacties() as $reactie) {
        echo 'Naam: '.$reactie->getNaam().'<br />';
        echo 'Reactie: '.$reactie->getReactie();
}

?>


Nu mezelf maar aan een database wagen... :)
 
Wouter J

Wouter J

08/01/2012 18:33:14
Quote Anchor link
Kijk dat ziet er heel goed uit! De OO gedachte is er zo te zien wel. Mag ik vragen waarom je met MySQLi werkt? Je kan -vind ik- veel beter met PDO werken in OO.

Verder moet je per bericht een update naar de db doen er een bericht bij plaatsen en in de constructor van Gastenboek moet je alle berichten ophalen uit de db en plaatsen in $_reacties. Hierdoor heb je alle berichten al.
 
Roel -

Roel -

08/01/2012 18:59:55
Quote Anchor link
Bedankt voor de tips. Ik heb geprobeerd het via PDO te doen en dit lukt denk ik niet helemaal goed. M'n database is nu opgezet maar ik heb 'ip' weggehaald (ook uit de code).

Ik probeer een error af te vangen, maar dit lukt geloof ik niet helemaal. Ook wordt er geen record ingevoegd, dus het gaat fout, maar ik krijg geen exception.
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
<?php
class Gastenboek {

        private $_db, $_reacties = array();
        
        public function __construct(PDO $connectie) {
                $this->_db = $connectie;
        }

        
        public function getReacties() {
                return $this->_reacties;
        }


        public function plaatsReactie(Reactie $reactie) {
                $query = "INSERT INTO gastenboek (naam, reactie, ip) VALUES (:naam, :reactie)";
                $statement = $this->_db->prepare($query);
                $statement->bindParam(':naam', $reactie->getNaam(), PDO::PARAM_STR);
                $statement->bindParam(':reactie', $reactie->getReactie(), PDO::PARAM_STR);
                $statement->execute();
        }
}


class Reactie {
        private $_naam, $_reactie;
        
        public function __construct($naam, $reactie) {
                $this->_naam = $naam;
                $this->_reactie = $reactie;
        }

        
        public function getNaam() {
                return $this->_naam;
        }

        
        public function getReactie() {
                return $this->_reactie;
        }
}


try {
        $database = new PDO('mysql:host=localhost;dbname=gastenboek', 'root', '');

        $gastenboek = new Gastenboek($database);
        $gastenboek->plaatsReactie(new Reactie('Roel', 'Voorbeeld'));
}
catch (PDOException $e) {
        echo 'Fout: '.$e->getMessage();
}

foreach ($gastenboek->getReacties() as $reactie) {
        echo 'Naam: '.$reactie->getNaam().'<br />';
        echo 'Reactie: '.$reactie->getReactie();
}

?>
 
Wouter J

Wouter J

08/01/2012 19:47:45
Quote Anchor link
Plaats gewoon alles in de try en vang de fouten op.

Tevens moet je met PDO setAttribute() gebruiken om met exceptions te werken (wat wel is aan te raden):
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
<?php

try
{
  $db = new PDO('mysql:host=localhost;dbname=naam', 'user', 'pass');
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $guestbook = new Gastenboek( $db );
}

catch( Exception $e )
{

  if( $e instanceof PDOException )
  {

    echo 'Error with DB: '.$e->getMessage();
  }

  else
  {
    echo 'Error: '.$e->getMessage();
  }
}

?>


In je query hebt je nog ip vergeten weg te halen. En je slaat nergens de gegevens op in $_reacties. Dit is hoe ik het zou 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
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

class Guestbook
{
  protected $reactions = array();
  protected $_db;

  public function __construct( PDO $db )
  {

    $this->_db = $db;

    // De select query
    $sQuery = "SELECT user, content FROM guestbook";
    $stmt = $this->_db->prepare($sQuery);
    $stmt->execute();

    while( $row = $stmt->fetch(PDO::FETCH_ASSOC) )
    {

      $this->reactions = new Reaction( $row['user'], $row['content'] );
    }
  }


  public function addReaction( Reaction $reaction )
  {

    $iQuery = "INSERT INTO guestbook ( user, content ) VALUES ( :name, :content )";
    $stmt = $this->_db->prepare($iQuery);
    $stmt->execute(Array(
      ':name', $reaction->getName(),
      ':content', $reaction->getContent()
    ));

    $this->reactions = $reaction;
  }


  public function getReactions()
  {

    return $this->reactions;
  }
}


class Reaction
{
  protected $user;
  protected $content;

  public function __construct( $user, $content )
  {

    $this->user = (string) $user;
    $this->content = (string) $content;
  }


  public function getName()
  {

    return $this->user;
  }

  public function getContent()
  {

    return $this->content;
  }
}

?>
 
Roel -

Roel -

08/01/2012 20:48:02
Quote Anchor link
Bedankt, hier kan ik veel van leren!
Waarom gebruik je overigens type cast? Ik snap nog steeds niet wanneer dat handig is in PHP, aangezien ze geen onderscheid maken tussen datatypes.
 
Synaps Framework

Synaps Framework

08/01/2012 20:54:05
Quote Anchor link
1 vraag: Waarom het database object parsen via de constructor en opslaan in een property? Sinds wanneer is het database object onderdeel van een gastenboek?
 
Wouter J

Wouter J

08/01/2012 21:10:24
Quote Anchor link
@Synaps, het db object is geen onderdeel van Gastenboek (vandaar dat ik _db gebruikte, dat gebruik ik voor properties die niet horen via OO maar nodig zijn voor de code). Hoe wil je het anders doen, via een global var? Of telkens de verbinding opnieuw aanmaken? Dit is de manier die ik altijd heb aangeleerd.

Roel van de Water:
Waarom gebruik je overigens type cast? Ik snap nog steeds niet wanneer dat handig is in PHP, aangezien ze geen onderscheid maken tussen datatypes.

Omdat ik vanuit C# gewent ben om altijd types mee te geven aan variabelen. En ik wil zeker zijn dat het geen er in de properties zit ook echt is wat ik wil dat erin zit.

Ik ben vergeten weer te geven hoe je die classes nou gebruikt:
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
try
{
  $pdo = new PDO('mysql:host=localhost;dbname=tabelnaam', 'user', 'pass');
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $guestbook = new Guestbook($pdo);

  foreach( $guestbook->getReactions() as $reaction )
  {

    echo '<h4>'.$reaction->getName().'</h4><p>'.$reaction->getContent().'</p>';
  }


  if( reactie_toevoegen )
  {

    $guestbook->addReaction( new Reaction( $_POST['name'], $_POST['content'] ) );
  }
}

catch(Exception $e)
{

  // Doe wat leuks.
}[/code]
Gewijzigd op 08/01/2012 21:10:46 door Wouter J
 
Synaps Framework

Synaps Framework

08/01/2012 21:49:40
Quote Anchor link
@Wouter, als je voor de gein het gasteboek object var_dumpt, zul je dus zien dat ook het gehele db object word gedumpt.

Een hele rotzooi.

Wat soms ook gedaan word is, wanneer je een functie aanroept welke de database nodig heeft, de database object word opgehaald via singleton.

Dit resulteert is schonere objecten. Daarnaast kun je geen resources serializen. Mocht je dit object dus wel willen serializen, dan moet je daarvoor weer een fix voor in bouwen.
 
Jelmer -

Jelmer -

08/01/2012 23:40:25
Quote Anchor link
Synaps Framework op 08/01/2012 20:54:05:
1 vraag: Waarom het database object parsen via de constructor en opslaan in een property? Sinds wanneer is het database object onderdeel van een gastenboek?

Dit gastenboek is onlosmakelijk gekoppeld met die database-verbinding. Netter zou zijn om het opslaan van de berichten weer in een ander object af te handelen, maar je moet ergens stoppen met abstraheren :) (In zo'n geval zou je een Reactie-object hebben dat een reactie beschrijft, een Gastenboek-object dat de regels van een gastenboek beschrijft, en een Reactie-store dat de reacties voor het gastenboek opslaat op een of andere manier. Dan kan je de methode van opslaan veranderen zonder je Reactie- of Gastenboek-class te veranderen. Je hoeft alleen maar een andere store mee te geven.)

Quote:
Mocht je dit object dus wel willen serializen, dan moet je daarvoor weer een fix voor in bouwen.

En dat heb je dan ook meteen goed afgevangen. Met een magic method zorg je er dan voor dat je alleen de array met reacties serialized. Hoe je dan weer een werkend en verbonden gastenboek terugkrijgt wanneer je het unserialized, ik vraag me af of je dat moet willen. Grote kans dat dingen out-of-sync raken als je dit soort dingen gaat doen.

Quote:
Wat soms ook gedaan word is, wanneer je een functie aanroept welke de database nodig heeft, de database object word opgehaald via singleton.

Singletons zorgen juist voor nog hardere koppelingen. Twee gastenboeken naast elkaar op verschillende databases kan je dan niet. Of heel ranzig. Singletons zou ik juist ten alle tijden proberen te vermijden. Die zijn net zo erg als globale variabelen. Wat zeg ik, het zijn globale variabelen, maar dan met een klein beetje meer controle vanuit de singelton zelf. Niet vanuit de gebruikende class, dat is het hele probleem. Geen idee welke andere class m'n singleton object zit aan te passen terwijl ik het gebruik. Brr. Leuk voorbeeld: een singelton database-verbinding en transacties.
 
Synaps Framework

Synaps Framework

09/01/2012 09:27:58
Quote Anchor link
Jelmer rrrr op 08/01/2012 23:40:25:
Synaps Framework op 08/01/2012 20:54:05:
1 vraag: Waarom het database object parsen via de constructor en opslaan in een property? Sinds wanneer is het database object onderdeel van een gastenboek?

Dit gastenboek is onlosmakelijk gekoppeld met die database-verbinding. Netter zou zijn om het opslaan van de berichten weer in een ander object af te handelen, maar je moet ergens stoppen met abstraheren :) (In zo'n geval zou je een Reactie-object hebben dat een reactie beschrijft, een Gastenboek-object dat de regels van een gastenboek beschrijft, en een Reactie-store dat de reacties voor het gastenboek opslaat op een of andere manier. Dan kan je de methode van opslaan veranderen zonder je Reactie- of Gastenboek-class te veranderen. Je hoeft alleen maar een andere store mee te geven.)

Quote:
Mocht je dit object dus wel willen serializen, dan moet je daarvoor weer een fix voor in bouwen.

En dat heb je dan ook meteen goed afgevangen. Met een magic method zorg je er dan voor dat je alleen de array met reacties serialized. Hoe je dan weer een werkend en verbonden gastenboek terugkrijgt wanneer je het unserialized, ik vraag me af of je dat moet willen. Grote kans dat dingen out-of-sync raken als je dit soort dingen gaat doen.

Quote:
Wat soms ook gedaan word is, wanneer je een functie aanroept welke de database nodig heeft, de database object word opgehaald via singleton.

Singletons zorgen juist voor nog hardere koppelingen. Twee gastenboeken naast elkaar op verschillende databases kan je dan niet. Of heel ranzig. Singletons zou ik juist ten alle tijden proberen te vermijden. Die zijn net zo erg als globale variabelen. Wat zeg ik, het zijn globale variabelen, maar dan met een klein beetje meer controle vanuit de singelton zelf. Niet vanuit de gebruikende class, dat is het hele probleem. Geen idee welke andere class m'n singleton object zit aan te passen terwijl ik het gebruik. Brr. Leuk voorbeeld: een singelton database-verbinding en transacties.


Singleton is zeker niet de oplossing. Wellicht kan de TS eens kijken naar de DI van Symfony? Vind het storen van een geheel DB object in je property echter een no-go.

Neemt niet weg dat TS hier geheel anders over denkt, het is puur mijn mening. Doe er dus mee wat je wilt ;).

Toevoeging op 09/01/2012 10:03:54:

Roel van de Water op 08/01/2012 17:50:29:
Wat ik nu eigenlijk zou willen, is dat ik het volgende kan gebruiken om reacties te tonen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$gastenboek
= new Gastenboek();
while ($reactie = $gastenboek->getReacties()) {
        echo 'Naam: '.$reactie->getNaam().'<br />';
        echo 'Reactie: '.$reactie->getReactie().'<br /><br />';
}

?>


Daarnaast, mocht je dit graag willen, dan zou je eens kunnen kijken naar ArrayObject of Iterator.

Gr.
Gewijzigd op 09/01/2012 10:06:30 door Synaps Framework
 
Gerhard l

gerhard l

22/02/2012 14:44:39
Quote Anchor link
Ik ben de laatste tijd ook een beetje aan het oefenen met OOP, ik heb de code bekeken, en het meeste spreekt wel voor zich, alleen wou ik hier graag wat meer uitleg over:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$_POST
['name'] = 'Bob';
$_POST['content'] = 'Hallo!';

// Er wordt een reactie toegevoegd:
if( reactie_toevoegen )
  {

    //Stuur je hier nou een Class Reaction mee, zodat je de get title en content
    //kan gebruiken?

    $guestbook->addReaction( new Reaction( $_POST['name'], $_POST['content'] ) );
  }

?>


Hier wordt het bericht afgehandeld

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
<?php
// Je geeft hier class reaction dus mee
  public function addReaction( Reaction $reaction )
  {

    //query
        $iQuery = "INSERT INTO guestbook ( user, content ) VALUES ( :name, :content )";
       //prepare
    $stmt = $this->_db->prepare($iQuery);
    //execute
        $stmt->execute(Array(    
        //Deze kan je dus ophalen omdat je de class hebt meegegeven gok ik
              ':name', $reaction->getName(),
              ':content', $reaction->getContent()
        ));

    //En dan vraag ik me af wat hier nog gebeurt, zet je hier nou de extra
    //waardes (Bob, Hallo!) in de array die je tijdens de construct al hebt
    //opgebouwd vanuit je database?

        $this->reactions = $reaction;
  }

?>
Gewijzigd op 22/02/2012 14:45:11 door gerhard l
 
Wouter J

Wouter J

22/02/2012 16:50:43
Quote Anchor link
>> Stuur je hier nou een Class Reaction mee, zodat je de get title en content kan gebruiken?
Je wilt een reactie toevoegen aan een gastenboek. Allebei de onderstreepte woorden zijn objecten en dienen dus een eigen class te hebben. Als je 1 object aan het andere object toevoegt, in dit geval dus een reactie aan het gastenboek, moet je ook de ene class toevoegen aan de andere.

Verder moet je niet denken, 'ik geef de reaction class mee omdat ik later functies daarvan nodig heb in de afhandeling van de method', maar je moet denken dat je het mee geeft omdat je 1 object aan het andere toevoegt. Objecten moet je apart van elkaar gebruiken. De reaction hoeft niet te weten dat hij gebruikt wordt in een gastenboek en het gastenboek hoeft niet te weten hoe de reaction class eruit ziet. Hij moet alleen zeker weten dat de reaction class 2 methods heeft: getName en getContent.

>> Je geeft hier class reaction dus mee
Nee, het meegeven doe je in het code blok ervoor. Op deze regel geef je aan dat je als parameter van de addReaction method een Reaction object verwacht. Als je iets anders meegeeft krijg je een error.

>> Deze kan je dus ophalen omdat je de class hebt meegegeven gok ik
Ja, $reaction bevat de class Reaction en dus kun je alles gebruiken wat je wilt van die Reaction klasse.

>> En dan vraag ik me af wat hier nog gebeurt, zet je hier nou de extra waardes (Bob, Hallo!) in de array die je tijdens de construct al hebt opgebouwd vanuit je database?
Allereerst zie ik dat er een foutje staat, het moet $this->reactions[] = $reaction zijn. Mijn excusses...

Maar om op je vraag te komen. Met deze functie voegen we de nieuwe Reaction object toe aan onze array met alle reacties van dit gastenboek. Het voordeel hiervan is dat we met Gastenboek::getReactions() gewoon meteen de array reactions kunnen returnen, i.p.v. eerst een DB query uit te voeren.
Tevens kun je vanuit OO oogpunt zeggen dat de reactions een eigenschap, en dus een propertie, is van het object Gastenboek.
 



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.