[OOP] Gastenboek

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

BI Developer @ Amsterdam

2021-09-17 iSense BI Developer Altijd al aan de slag willen gaan in een Enterprise omgeving als ervaren BI Developer? Wil jij BI oplossingen bedenken en bouwen voor gebruikers wereldwijd? Wil jij graag aan de slag met SSRS, SSAS, SSIS, T-SQL en Azure? Wil jij meewerken aan verschillende uitdagende projecten? Reageer nu! ISPA48510 Organisatie De organisatie waar je komt te werken als (Senior) BI Developer is een grote internationale financiële instelling. Met vele vestigingen in Nederland zijn ze een belangrijke speler op de financiële markt. Jij zal hoofdzakelijk op het kantoor in Amsterdam werkzaam zijn, maar het kan ook voorkomen dat

Bekijk vacature »

IT-traineeship Low Code Developer

Vind jij het leuk om veel contact te hebben met een klant en je te verdiepen in een domein? Lijkt het je interessant om enerzijds met de klant mee te denken, maar tegelijkertijd ook zelf een bijdrage te leveren aan de implementatie van een IT oplossing? Wij zijn op zoek naar starters die aan de slag willen als low-code engineer. In deze functie bouw je aan applicaties met behulp van een low-code platform, zoals Outsystems, Blueriq, Mendix of Pega. Dergelijke platformen stellen je in staat om snel een werkende applicatie te ontwikkelen en zijn hierdoor heel geschikt voor maatwerk projecten.

Bekijk vacature »

Junior Fullstack Java Developer @ Regio Amsterdam

2021-10-14 iSense Junior Fullstack Java Developer Heb je onlangs een hbo-, wo-opleiding of een minor richting de IT afgerond en wil je graag aan de slag als Fullstack JAVA Developer? Lees dan snel verder! Want in februari 2022 start de Experis Academy weer met een leerprogramma waarin IT-experts je opleiden tot developer met als specialisatie JAVA. Dit allemaal met een salaris en een vooruitzicht op een baan bij een topwerkgever. ISNA51153 Wat ga je doen tijdens het Fullstack JAVA ontwikkeltraject? Vanaf februari 2022 krijg jij via de Experis Academy een unieke kans om jouw IT-carrière een kickstart te geven en

Bekijk vacature »

Medior fullstack .NET developer @ Rotterdam

2021-05-12 iSense Medior fullstack .NET developer Medior fullstack .NET Developer ISAR49770 Organisatie Onze klant is een grote internationale speler. Ze investeren steeds in het uitbreiden van het analyse- en servicepakket om de klanten goed van dienst te kunnen blijven. Naast Nederland zijn er nog enkele andere locaties in Europa waar ze zijn gevestigd. IT is verspreid over alle vestigingen. Op elke locatie zijn Developers en System engineers aanwezig. Onze klant is marktleider binnen het gebied waarin zij actief zijn. Nu zijn wij op zoek naar verschillende developers, die er samen met het andere personeel, 110% voor willen gaan. Taken .Net

Bekijk vacature »

C#.Net Developer @ Regio Rotterdam

2021-06-10 iSense C#.Net Developer C#.Net Software Developer ISAR50076 Nieuw Organisation Our client is an international organization in the industrial sector, the head office is based in The Netherlands. For the R&D Deptartment, we are looking for a C#.Net Developer who likes to work with a stand alone application. You will be working in an international team with 2 other Developers, a Teamlead and external Developers. Within the R&D department, there is a wide variety of nationalities so they communicate in English. You will be part of a Scrum team and work in two weekly sprints. To strengthen the internal team,

Bekijk vacature »

C# / Angular / Developer @ Goeree-Overflakkee

2020-08-31 iSense C# Angular Developer C# Angular Developer Ontwikkelaar Leaseauto ISRA47435 Organisatie Onze klant is een IT dienstverlener, ter versterking van het team zijn ze op zoek naar een ervaren C# .NET Ontwikkelaar. Development bestaat uit 24 developers verdeeld over teams van 6 man. Met het team ben je verantwoordelijk voor een aantal nationale en internationale opdrachtgevers. Deze organisatie zet graag mensen in hun kracht waar ze goed in zijn. Ongeacht je persoonlijkheid wordt hier een plek gecreëerd waar jij je prettig bij voelt. Mensen werken hier met plezier en dat is te zien aan het aantal dienstjaren en het

Bekijk vacature »

PHP en klant contact - unieke functie met goede vo

Bedrijfsomschrijving Mijn klant is een gezonde en sterk groeiende partij die actief is in de wereld van online-marketing. Ze behoren tot één van de sterkst groeiende partijen op dit vlak van dit moment met hele bekende klanten. Ze zijn met hun campagnes zeer succesvol. Ze doen technisch erg slimme en complexe dingen die te maken hebben met hele grote hoeveelheden data. Ze werken voornamelijk voor bekende A merken en daar verzorgen ze een groot deel van de online communicatie voor. Functieomschrijving Er is bij deze klant een rol vrijgekomen voor iemand met zowel PHP als front-end ervaring die aan de

Bekijk vacature »

Software Developer / .NET @ Deventer

2021-06-07 iSense Software Developer .NET Ben jij een Software Developer en heb je eerder ervaring opgedaan met C#? Ben je op zoek naar een nieuwe functie en lijkt het je leuk om mee te denken en te sparren met de Lead Developer? Lees snel verder en solliciteer! ISRO49470 Nieuw Organisatie Je komt te werken als Software Engineer bij een organisatie gespecialiseerd in de Automatisering voor klanten van hen in de productiebranche. Ze zijn ongeveer 100 man groot en je komt terecht in een development team van 7 man. De wens is om dit met een developer uit te breiden; iemand

Bekijk vacature »

Functioneel Beheerder IAM en database (G!DS)

Waar het horrorverhaal IT van Stephen King, kilometers aan zeldzame boeken en functionaliteitenbeheer samenkomen. Dat is de KB in Den Haag. En het is de plek waar jij als functioneel beheerder de gegevens van miljoenen Nederlanders en honderden bibliotheken en hun aanbod verwerkt en beschermt. Maak jij het mogelijk? In deze functie maak je direct maatschappelijke impact. Je zorgt ervoor dat miljoenen Nederlanders kunnen inloggen op en gebruik kunnen maken van al onze diensten (zoals bijvoorbeeld de Online Bibliotheek en de KB catalogus). Je bent als onze functioneel beheerder IAM en database (G!DS) hierdoor actief bezig met het bieden van

Bekijk vacature »

Business Developer III

Description of activities: Digital is de norm. En dat geldt ook zeker voor ABN AMRO. Daarom werken we er bij Online Channels hard aan om zo veel mogelijk diensten online mogelijk te maken voor onze klanten. Online Channels is een afdeling binnen de business line Commercial Banking (zakelijk) die de digitale dienstverlening ontwikkelt voor zakelijke klanten, van zzp’ers tot corporates. Een doelgroep met complexe financiële behoeften, waarvoor we bij Online Channels zorgen voor de beste manier om diensten en services digitaal te ontsluiten. Denk aan de mogelijkheden om online klant te worden, het vergroten van online self-service mogelijkheden, online betalingen

Bekijk vacature »

Business Developer IV

We are looking for a Business Developer Datawarehouse for a large bank in Amsterdam. Description of activities: Je werkt als onderdeel van een (Nederlandstalig) Scrumteam aan de episodes van Finance & Risk Information Services Hypotheken. Door inzicht te geven in de hypothekendata aan de organisatie helpt de afdeling FRIS om belangrijke doelstellingen van ABN AMRO te behalen. Denk hierbij voornamelijk aan rapportagevereisten vanuit de Regulators zoals ECB, DNB, AFM, EBA, accountants en internal auditors. Elke maand wordt vanuit de F&R Circle prioriteiten vastgesteld voor op te pakken Episodes voor ongeveer 3 scrumteams. Als DWH developer werk je voornamelijk back-end aan

Bekijk vacature »

Software Developer Azure .NET

Eindhoven Bij OrangeNXT werken wij met een team dat beschikt over diepgaande kennis en expertise over digitale transformatie. Wij brengen people, devices en data moeiteloos bij elkaar. Dit doen we met een team dat bestaat uit diverse expertises: data engineers, data scientist, azure developers en we hopen jou als .NET (en Azure) developer aan ons team toe te voegen! Ben jij een kei in het ontwerpen en coderen van software, maar wil je meer dan dat? Ben je klaar voor een volgende stap en heb je een gezonde groei ambitie? Dan zijn wij op zoek naar jou. Ter uitbreiding van

Bekijk vacature »

Senior OutSystems Developer

Wie zijn wij? In korte tijd hebben we als startup een platform ontwikkeld en in de markt gezet voor het organiseren van volledige mobiliteit van consumenten en medewerkers van bedrijven. Openbaar vervoer, deelauto’s, deelfietsen en nog veel meer kun je plannen, boeken, betalen en gebruiken met ons platform bestaande uit onder meer een app, backend en een multimodale reisplanner. Met een jong en slagvaardig team zijn we in rap tempo de markt aan het veroveren. Nu nog hoofdzakelijk in Nederland maar met grote plannen om de grens over te gaan. We zoeken naar een senior OutSystems Developer om de ontwikkeling

Bekijk vacature »

Front-End Developer / JavaScript / Vue.JS / Financ

2021-05-24 iSense Front-End Developer / JavaScript / Vue.JS / Financial organization ISDI47550 Company profile Our client is a large organisation in the banking sector, offering various products and services across Europe. The department you will work for consists of multiple Scrum teams based in Amsterdam, but also have team members working for their vendor partner at an off-shore location in India. The department responsible for three different large applications that are being used internally by other teams. The current architecture does not suffice with the present-day standards and will therefore (need to) be renewed. To do so, the team will

Bekijk vacature »

Senior C# Developer IoT Platform (NL) bij PostNL

Senior C# Developer IoT Platform (NL) Den Haag HBO/WO IT Professional Om alle Unique Loading Devices (ULD's) real-time te kunnen volgen, hebben we een IoT landschap gecreëerd dat ons continu update met de locatie en sensor informatie van de ULD's. Het IoT platform is volledig ontworpen met behulp van AWS serverless componenten en Serverless Architecture staat in het middelpunt van al onze ontwerpen. Enkele van de componenten die we gebruiken zijn AWS IoT services, Amazon Location Services, AWS Lambda enzovoort. Op ons platform vertalen we alle detecties van ULD's, vanuit AWS IoT Core naar relevante informatie over wanneer een ULD

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 01:18:54
 
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.