Tips eerste OOP scriptje

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

C# developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als C# Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij dit jaar Microsoft Partner of the Year geworden. Sogetisten staan klaar voor elkaar, hebben lol met elkaar en daarmee behalen we de mooiste resultaten! Werken bij Sogeti

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

Randstad - Freelance Backend Developer/ Data Engin

Starting date: 10.05.2023 Salary range: €67,00 - €77,00 Duration: 6 months Hours: 40 Working model: Hybrid* MUST be NL based Job description: Our vision is to have a consistent and data driven experience for all sales across all our operating companies. Our mission is to enable our salespeople to be able to reach out to the right company at the right time. We do this by creating data driven micro services and solutions. We mainly focus on implementation in the Google Cloud but also integrate with local systems and other cloud solutions. A typical day: As a back-end developer you

Bekijk vacature »

Junior Software Developer (HBO / WO)

Functie omschrijving Wij zijn op zoek naar een Junior Software Developer! Sta jij aan het begin van je carrière en heb je net je HBO of WO-diploma in de richting van ICT of Techniek mogen ontvangen? En heb jij grote affiniteit met software development? Dan hebben wij bij Jelling IT Professionals de perfecte opdrachtgever in de omgeving van Utrecht, die jou tot een volwaardig Fullstack Software Developer gaat opleiden. Binnen deze grote organisatie krijg je ruime en professionele trainingen die jouw in korte tijd vakbekwaam maken. Niet alleen het aan technisch aspect, maar ook zeker jouw persoonlijke ontwikkeling wordt veel

Bekijk vacature »

Laravel developer

Zie jij mogelijkheden om onze tooling technisch te verbeteren en uit te bouwen? Over Jobmatix Jobmatix is een innovatieve en internationale speler op het gebied van jobmarketing. Onze jobmarketing automation tool helpt organisaties bij het aantrekken van nieuw talent door vacatures digitaal, geautomatiseerd en op een efficiënte manier te adverteren en onder de aandacht te brengen bij de doelgroep op 25+ jobboards. Volledig performance-based, waarbij organisaties betalen op basis van cost per click of cost per applicant. Maandelijks wordt onze jobmarketing automation tool al gebruikt door vele directe werkgevers, intermediairs en mediabureaus, waaronder Picnic, Rijkswaterstaat, AdverOnline, Schiphol, DPA, Teleperformance en

Bekijk vacature »

Front-end Developer

Gezellige team, passie en een groene toekomst! Lees hier de vacature van Front-end Developer bij All in Power! All in power heeft zich tot doel gesteld écht bij te dragen aan de energietransitie. Dit doen wij door de markt voor energie volledig op zijn kop te zetten. Producenten van schone (wind- of zonne-)energie verkopen via ons platform hun energie rechtstreeks aan gebruikers. Of dit nu huishoudens, bedrijven of bijvoorbeeld laadpalen zijn ons platform maakt het uitwisselen van energie mogelijk. Zo maken we de business case van onze klanten veel sterker en loont het om (meer) te investeren in vergroening voor

Bekijk vacature »

.NET developer

Functie Jouw team van vier collega .NET developers is verantwoordelijk voor het bouwen van de ETL processen van jouw nieuwe werkgever. Op dit moment wordt de front-end gedaan door een extern team van professionals. Echter wilt jouw nieuwe werkgever graag intern deze kennis uitbreiden en heeft dan ook de ambitie om dit voor het eind van het jaar intern te gaan aanpakken. Dit betekend dat jij als .NET ontwikkelaar de ideale kans krijgt om jezelf samen met jouw collega’s te ontwikkelen als full stack developer. Als .NET ontwikkelaar werk jij bij deze gave werkgever met C# .NET, SQL, JavaScript, REST

Bekijk vacature »

Software Developer C# .NET

Functie omschrijving Software Developer C# .NET gezocht voor een dynamische organisatie! Ben jij net afgestudeerd of toe aan een volgende stap in je maatschappelijke carrière? Lees dan snel verder! Wij zijn op zoek naar een Software Developer die klaar is voor een nieuwe uitdaging en die een organisatie in de regio Houten wil versterken. Je werkt in deze functie aan verschillende projecten en gaat vaak op bezoek bij klanten. In deze functie kun je een grote mate van uitdaging, diversiteit en verantwoordelijkheid verwachten. Bedrijfsprofiel Waar kom je te werken? Je komt te werken bij een organisatie dat gespecialiseerd is in

Bekijk vacature »

C# developer

Functie Als ervaren Software Engineer wordt jij verantwoordelijk voor het bedenken en ontwikkelen van technische (maatwerk) oplossingen voor onze klanten en dit samen met de klant af te stemmen. Jij wordt o.a. verantwoordelijk voor de doorontwikkeling het software pakket welke voor ons enorm belangrijk is. Dit pakket zorgt er namelijk voor dat wij complete productielijnen kunnen aansturen en monitoren. Daarnaast heb jij actief contact met onze hoofdvestiging om het software achter een van onze systemen te verbeteren en te herschrijven. Momenteel zijn onze C# applicaties geschreven met o.a. Winforms. Echter hebben wij de actieve ambitie om dit te gaan herschrijven

Bekijk vacature »

SQL database ontwikkelaar

Functie omschrijving Ben jij niet bang voor complexe algoritmes? Schikt het schrijven van procedures in T-SQL jouw niet af en heb jij al de nodige informatie in SQL, dan is functie precies wat voor jou! Jouw werkzaamheden gaan er als volgt uit zien: Je gaat werken aan de complexere projecten waar jij van A tot Z bij betrokken bent. Je gaat zorg dragen voor het ontwerp, de ontwikkeling en het updaten van SQL databases. Dit doe je op basis van T-SQL. Jij bent van start tot finish betrokken bij de projecten die jij leidt. Je houdt contact met klanten en

Bekijk vacature »

Front-end developer

Functie Jij komt te werken in een team van 5 developers. het product is continue in beweging. Nieuwe en bestaande klanten vragen om vaak nieuwe features. Hierin ben jij zeer belangrijk om te zorgen dat de functionaliteiten goed opgezet worden op technisch vlak. Designs krijg je aangeleverd van een externe partij zodat jij je primair kan focussen op de techniek! Je hebt daarbij alle vrijheid om je eigen creativiteit toe te passen en mee te denken over de gebruikte technieken. Het gezamenlijke doel is een product dat functioneel zeer gebruiksvriendelijk is en het bedrijfsproces van de gebruikers versneld en kwalitatief

Bekijk vacature »

Mendix Developer

Voor Troostwijk Groep zoeken wij een: Mendix Developer Wij zoeken Je bent een getalenteerde en ervaren Mendix Developer en het is tijd om je horizon te verbreden. Je wilt minder coderen en meer modelleren, minder bezig zijn met allerlei technische details en randvoorwaarden en meer met functionaliteit. Daarnaast ben je trots op de innovatieve en gebruiksvriendelijke applicaties die je in de loop van de jaren hebt gebouwd. Werk je graag in een enthousiast team, wil je veel vrijheid en kun je tegelijkertijd goed met deadlines omgaan, dan ben jij absoluut degene die wij zoeken! Wat je nodig hebt is ruime

Bekijk vacature »

Leidinggevend Full Stack Developer

Hé jij, nieuwe Pinkcuber! Ga aan de slag bij Pinkcube, online leverancier van promotieartikelen! Een innovatieve organisatie waar extra stappen zetten voor klanten de normaalste zaak van de wereld is. Ambitieus zijn we ook. ‘Naoberschap’ staat bij Pinkcube hoog in het vaandel; we helpen elkaar en iedereen is welkom. Pinkcube is Great Place to Work Certified, erkend leerbedrijf, maatschappelijk betrokken partner van stichting Present en partner van CliniClowns. En misschien wel jouw nieuwe werkgever. Wij zoeken namelijk een enthousiaste: Leidinggevend Full Stack Developer (40 uur, medior/senior) Ben jij klaar om baanbrekende ideeën tot leven te brengen en deel uit te

Bekijk vacature »

Database Developer

Functieomschrijving Wat ga je doen? Als developer ben jij samen met een gemotiveerd team van 10 collega’s verantwoordelijk voor het creëren van aangemeten software voor klanten. Je bent klantvriendelijk en oplossingsgericht ingesteld, omdat het essentieel is om de klanten zo goed mogelijk te helpen met hun uitdagingen. Het is mogelijk om vanuit huis je werkzaamheden uit te voeren, maar het is ook prettig als je in de omgeving van Tilburg woont om naar het kantoor te kunnen komen. Vind jij het leuk om jouw creatieve vaardigheden te benutten om complexe systemen te ontwikkelen? Lees dan snel verder! Bedrijfsprofiel Voor wie

Bekijk vacature »

PHP Software Developer

Functie omschrijving PHP Software Developer gezocht! Voor een organisatie in de regio Zeist die zich bezighoud met het verbeteren van de medicatieveiligheid zoeken wij een Software Developer. In deze functie zijn wij op zoek naar een slimme en enthousiaste Developer die interesse heeft in farmacie, logistiek en ICT. Daarnaast beschik je over een goed analytisch vermogen en ben je van nature gestructureerd en resultaatgericht. Je moet in deze functie daadkrachtig, flexibel en communicatief goed zijn. Je verantwoordelijkheden bestaan uit: Object georiënteerd programmeren; Werken in een scrumteam aan de ontwikkeling van een medicatiebewakingssysteem; Meedenken over de mogelijkheden en onmogelijkheden van projecten;

Bekijk vacature »
Cedric

Cedric

26/03/2008 20:16:00
Quote Anchor link
Hey PHP'ers,

Ik programmeer nu toch al een tijdje, en heb al veel de tip gekregen om eens te beginnen met OOP. Ik had er wat over gelezen op internet en het leek mij allemaal iets te moeilijk. Ik heb mezelf nu toch eens kunnen overhalen om eens een scriptje in classes te schrijven.

Ik heb dus een mini-telefoonboekje geschreven en natuurlijk had ik graag tips gehad. Ik ken dus zo goed als niks van OOP, dus graag tips en opmerkingen.

Online voorbeeldje: http://freshcreations.be/case/oop/

Hier volgt het scriptje dat ik schreef:

mysql.class.php
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
<?php

class mysql
{    
    public function __construct($server = '', $username = '', $password = '')
    {

        mysql_connect($server, $username, $password);        
    }

    
    public function Select_Db($db = '')
    {

        if(!empty($db))
        {

            mysql_select_db($db);
        }

        else
        {
            echo 'Please specify a database.';
        }
    }
}


?>


phonebook.class.php
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
109
110
111
112
113
114
<?php

class phonebook
{
    public $number;
    public $name;
    
    public function __construct()
    {
        
        if($_SERVER['REQUEST_METHOD'] == "POST")
        {

            $this->ProcessForm();
        }

        
        if(isset($_GET['id']) && !empty($_GET['id']))
        {

            $this->ShowDetails();
        }

        else
        {
            $this->ShowList();
            
            if($_GET['action'] == "add")
            {

                $this->ShowForm();
            }

            else
            {
                echo '<a href="?action=add">Add person</a>';
            }
        }        
    }

    
    public function ProcessForm()
    {

        if(!empty($_POST['name']) && !empty($_POST['number']))
        {

            $query = "INSERT INTO persons (name, number) VALUES('".htmlspecialchars(mysql_real_escape_string($_POST['name']))."', '".htmlspecialchars(mysql_real_escape_string($_POST['number']))."')";
            $result = mysql_query($query) or die(mysql_error());
            
            if($result)
            {

                echo 'The person has been added to the phonebook.';
            }

            else
            {
                echo 'Something went wrong while trying to add the new person to the phonebook.';
            }
        }

        else
        {
            echo 'You have to fill in all the fields.';
        }
    }

    
    public function ShowList()
    {

        $query = "SELECT id, name, number FROM persons";
        $result = mysql_query($query) or die(mysql_error());
        
        if(mysql_num_rows($result) > 0)
        {

            echo '
            <table border="1">
            <tr>
            <td width="60">Name</td><td width="110">Number</td><td width="30">Detail</td>
            </tr>'
;
            
            while($row = mysql_fetch_assoc($result))
            {
            
                echo '
                <tr>
                <td>'
.$row['name'].'</td><td>'.$row['number'].'</td><td align="center"><a href="?id='.$row['id'].'">X</a></td>
                </td>
                </tr>'
;
            }

            echo '</table><br />';
        }

        else
        {
            echo 'No records present.<br /><br />';
        }
    }

    
    public function ShowDetails()
    {

        $query = "SELECT name, number FROM persons WHERE id = '".$_GET['id']."'";
        $result = mysql_query($query) or die(mysql_error());
        
        if(mysql_num_rows($result) == 1)
        {

            $row = mysql_fetch_assoc($result);
            
            echo 'Name: '.$row['name'].'<br />';
            echo 'Number: '.$row['number'].'<br /><br />';
        }

        else
        {
            echo 'This record doesn\'t exist.';
        }
    }

    
    public function ShowForm()
    {

        echo '
        <form action="" method="post">
        Name: <input name="name" type="text" /><br />
        Number: <input name="number" type="text" /><br /><br />
        <input name="Submit" type="submit" value="Submit" id="Submit" />
        </form>'
;
    }
}


?>


index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

include "mysql.class.php";
include "phonebook.class.php";

$db = new mysql('localhost', '***', '***');
$db->Select_Db('***');

$phonebook = new phonebook;
?>
Gewijzigd op 01/01/1970 01:00:00 door Cedric
 
PHP hulp

PHP hulp

22/12/2024 06:39:07
 
Thijs X

Thijs X

26/03/2008 20:34:00
Quote Anchor link
Als je OO gaat programeren is het de bedoeling dat je zoveel mogelijk gescheiden houd,
bij het voorbeeld zou ik zelf kiezen voor de volgend 2 klasses
- Telefoonboek
( Deze heeft een Array met objecten van Personen )
- Persoon
( Hierin worden alle gegevens opgeslagen van de persoon )


- Nooit echoen in je klasses, maak gebruik van return en return een string die je vervolgens in je pagina pas echoed.
- VOor het weergeven van fouten kan je Exceptions gebruiken.
- Maak gebruik van PDO ( Goed artikel: http://www.phphulp.nl/php/tutorials/8/534/ )
- Classnamen altijd met hoofdletter beginnen
- Namen van methodes met kleine letter beginnen
 
Jelmer -

Jelmer -

26/03/2008 20:35:00
Quote Anchor link
Mijn tip: denk niet in functies, dingen die het moet doen, maar denk in objecten (dôh!), dingen die je hebt.

Wat heb je?
- Telefoonboek
- Vermeldingen in het telefoonboek. (Een vermelding zou ook los van het telefoonboek kunnen voorkomen, bijvoorbeeld in de vorm van een visitekaartje, dus daarom is deze niet een met het telefoonboek.)

Wat heeft je telefoonboek voor eigenschappen?
(de public properties)
- geen :(

Wat kan je telefoonboek?
(de public methods)
- vermeldingen ophalen
- vermeldingen toevoegen

Wat heeft je telefoonboek daarvoor nodig?
(de protected properties & methods)
- een database-verbinding.

Wat heeft je vermelding voor eigenschappen?
- een id, uniek nummer, auto-increment kolom bijvoorbeeld.
- naam
- nummer

Wat kan je vermelding
- niet echt iets. Misschien dat je een functie kan verzinnen waarmee hij wordt weergegeven in de vorm van een hCard, al is het de vraag of je die mix van presentatie & data wilt maken.

Wat heeft je vermelding daarvoor nodig?
- niets

Dus om het even samen te vatten:
Je hebt nodig: Een database-link (ik zou gewoon lekker gemakkelijk voor PDO gaan), een Telefoonboek-klasse en een Vermelding-klasse. De telefoonboek-klasse geef je een PDO-instantie mee in de constructor, en heeft methods om vermeldingen uit de database te halen, op te slaan en te verwijderen. De ophaal-methods geven een array met instanties van Vermelding terug, de save & delete methods accepteren een instantie van Vermelding (je hoeft de instantie van Vermelding niet eens helemaal te vullen, zo lang hij maar het id van de database-regel heeft zodat het telefoonboek weet welke hij moet verwijderen.)
 
Stien ss

stien ss

26/03/2008 20:38:00
Quote Anchor link
Ok om te beginnen met de eerste classe. Bij je Select_db methode als er geen db wordt mee gegeven moet je een exception throwen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
     throw new Exception ( 'Invalid database specified for selection' );
?>


In een class moet je ( vrijwel ) nooit echoen. Met een exception kun je nu een error opvangen op een lager niveau en dan kan je er wat aan doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
     try {
          $db = new mysql(..);
     }
catch ( Exception $e ) {
          $db = new mysql(andere gegevens);
          // of miss wil je wel een error op het scherm printen, dat is niet aan het object zelf om dat af te handelen.
     }
?>


Veder is het misschien slim om ook een optionele parameter aan je constructor mee te geven voor de te selecten database.

Over het algemeen is het ook makkelijk om je open connectie bij te houden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
     protected $connection;

     // en dan in je constructor:
    $connection = mysql_connect (...);
?>


Dan kan je bijvoorbeeld in je destructor weer de connectie sluiten.
 
Cedric

Cedric

27/03/2008 08:51:00
Quote Anchor link
@Jelmer
Op de site waar ik het een en ander over OOP te weten probeerde te komen vond ik een voorbeeldje van een OO gastenboek. Dit bestond ook maar uit 1 class..

De telefoonboek-class versta ik, het bevat zowat wat ik in mijn class had. Maar de vermelding class snap ik niet echt.. In de telefoonboek class doe je toch al alles wat nodig is? En die functies, ik moet dus denken met wat ik heb? Maar wanneer mag ik dan bijvoorbeeld maar het form echoën? En hoort dat in de class te gebeuren of met een instancevan de class?

Blijkbaar was het voorbeeld die ik bekeek niet zo goed geschreven als ik het zo bekijk.. Heb je misschien een voorbeeld van een gelijkaardig script die dan wel goed geschreven is? Dan kan ik dat eens goed bestuderen en uit leren.
 
Jelmer -

Jelmer -

27/03/2008 15:53:00
Quote Anchor link
De truc met Object orientated programmeren is dat je niet meer gaat denken in simpele typen zoals strings en nummertjes, en arrays, maar in objecten en collecties. -- maar dat met die collecties in plaats van arrays kan je in het begin nog wel even achterwege laten.

Een gastenboek in 1 klasse is niet werkelijk OO geprogrammeerd. Dat is gewoon het ontwerp opdelen in functies, en die achter elkaar aanroepen.

De klasse Vermelding is nu nog niet erg nuttig, maar met oog op de toekomst heb je nu een plek waar je later functies aan toe kan voegen, bijvoorbeeld voor het opvragen van bijvoorbeeld het netnummer. Dan maak je een method in je Vermelding-klasse erbij die dat deel van het telefoonnummer teruggeeft en de rest van de code hoef je niet te veranderen. Stel dat je nu je database een beetje anders inricht, en ook het landnummer in het telefoonnummer gaat opnemen. Dan kan je de methods van Vermelding die het telefoonnummer en het netnummer aanpassen zodat ze het landnummer niet ook meegeven, en je kan er een nieuwe method bij maken. De rest van je code hoeft dan niet te veranderen, omdat die slechts afhankelijk is van de buitenkant, de API van de klasse Vermelding en niet verbonden is met de werking binnenin. Dat is een van de gevolgen van OOP. Je geeft de objecten hun verantwoordelijkheden, waardoor die logica die daarvoor nodig is maar op 1 plek in de code staat gedefinieerd. Er is maar 1 plek waar die fout kan gaan, en er is maar 1 plek waar je de code hoeft te veranderen wanneer je de werking wat wilt aanpassen. Zoek maar eens op abstractie.

Een formulier echo'en e.d, oftewel presentatie zou ikzelf nooit in klassen doen, maar in aparte php-bestanden die ik al dan niet include. Je kan er ook templates voor gebruiken mocht je dat leuk vinden, al heeft het weinig toegevoegde waarde. Door de presentatie buiten de klassen te houden kan je de klassen voor veel meer doeleinden gebruiken. Daarnaast is het gewoon prettig om PHP logica & HTML zo weinig mogelijk te mixen, niet mixen is overzichtelijker. Het afhandelen van je formulier, en de eigenschappen van het object veranderen op basis van de $_POST-argumenten doe je gewoon op de manier zoals je dat altijd hebt gedaan, buiten een klasse. Eventueel maak je er later een controller-klasse van conform met het MVC design pattern. Dan kan je ook die logica hergebruiken mocht dat nodig zijn.
 
Cedric

Cedric

27/03/2008 16:12:00
Quote Anchor link
Nu vind ik het stom dat ik een tutorial gelezen heb waar het voorbeeld 'slecht' was :p

Ik ben nu weer opnieuw aan het proberen, maar het lijkt nu wel of ik gewoon een verzameling functies maak, niets meer. Ik begrijp het OOP gedoe natuurlijk nog niet echt.. Maar heb je misschien een voorbeeld van een scriptje die volgens jou wél goed geschreven is? Dan kan ik mij daar op baseren en kijken hoe alles in elkaar zit. Ik heb hier nu wel een OO webshop liggen maar deze is gewoon té uitgebreid om als beginner er even tussenin te kruipen en alles proberen te begrijpen.

Nu zit ik namelijk weer zo vast als iets. Een goed voorbeeld zou zeker aangenaam zijn ;)
 
Jelmer -

Jelmer -

27/03/2008 19:27:00
Quote Anchor link
Een script dat ik eerder als voorbeeld voor iemand heb gemaakt: http://mirror.ikhoefgeen.nl/OOP%20Programmeren.zip
 
Cedric

Cedric

27/03/2008 19:32:00
Quote Anchor link
Bedankt, ik ga er meteen even naar kijken. Ik had nu ook net iets nieuws geprobeerd. Ik post het even, hopelijk is het nu beter..

phonebook.class.php
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
<?php

class Phonebook
{
    public $id;
    public $name;
    public $number;
    public $data;
    
    public function __construct()
    {
        
        // Niks?
    }
    
    public function get_data()
    {

        $this->data = array("id" => $this->id, "name" => $this->name, "number" => $this->number);
        
        return $this->data;
    }

    
    public function set_name($name)
    {

        $this->name = $name;
    }

    
    public function set_number($number)
    {

        $this->number = $number;
    }

    
    public function add_record()
    {

        $query = "INSERT INTO persons (name, number) VALUES('".mysql_real_escape_string($this->name)."', '".mysql_real_escape_string($this->number)."')";
        $result = mysql_query($query) or die(mysql_error());
        
        if($result)
        {

            return true;
        }

        else
        {
            return false;
        }
    }

    
    public function get_record($id)
    {

        $query = "SELECT id, name, number FROM persons WHERE id = '".$id."'";
        $result = mysql_query($query) or die(mysql_error());
        
        if(!$result)
        {

            return false;
        }

        else
        {
            $row = mysql_fetch_assoc($result);
        
            $this->id = $row['id'];
            $this->name = $row['name'];
            $this->number = $row['number'];
            
            return true;
        }
    }

        
    public function get_all_records()
    {

        $query = "SELECT id, name, number FROM persons";
        $result = mysql_query($query) or die(mysql_error());
        
        while($row = mysql_fetch_assoc($result))
        {

            $record = new Phonebook;
            $record->get_record($row['id']);
            $records[] = $record;
        }

        
        return $records;
    }
            
}


?>


index.php
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
<?php

include "mysql.class.php";
include "phonebook.class.php";

$db = new MySQL('localhost', '***', '***');
$db->select_db('***');

if($_SERVER['REQUEST_METHOD'] == "POST")
{

    if(!empty($_POST['name']) && !empty($_POST['number']))
    {

        $obj = new phonebook;
        
        $obj->set_name(htmlspecialchars($_POST['name']));
        $obj->set_number(htmlspecialchars($_POST['number']));
        
        if($obj->add_record())
        {

            echo 'Your record has been added.<br />';
        }

        else
        {
            echo 'Something went wrong while adding the record.<br />';
        }
    }

    else
    {
        echo 'You need to fill in all the fields.<br />';
    }
}


echo '
<table border="1">
<tr>
<td width="60">Name</td><td width="110">Number</td><td width="30">Detail</td>
</tr>'
;

foreach(Phonebook::get_all_records() as $phonebook)
{

    echo '
    <tr>
    <td>'
.$phonebook->name.'</td><td>'.$phonebook->number.'</td><td align="center"><a href="?id='.$phonebook->id.'">X</a></td>
    </td>
    </tr>'
;
}


echo '</table><br />';
    
?>


<form action="" method="post">
Name: <input name="name" type="text" /><br />
Number: <input name="number" type="text" /><br /><br />
<input name="Submit" type="submit" value="Submit" id="Submit" />
</form>


Ik vind wel dat het nogal traag laadt. Maar is dit al beter dan de vorige keer?
 
Jelmer -

Jelmer -

27/03/2008 20:03:00
Quote Anchor link
Beetje vreemd. Voor ieder telefoonnummer maak je een nieuw telefoonboek aan, en fetch je opnieuw alle data. Een telefoonnummer is toch niet een eigenschap van een telefoonboek? Een kaft is, maar een telefoonnummer hoort thuis in een klasse vermelding. Daarom zei ik dat je die los moest trekken.
 
Cedric

Cedric

27/03/2008 20:11:00
Quote Anchor link
Toen ik eraan bezig was, begon ik het ook raar te vinden. Begin het mss al een klein beetje te snappen, weetniet :P

Ik moet nu in feite nog een onderscheid maken welk functies in de boekklasse moet en welke in vermeldingklasse..

Ik moet dus in die loop vermeldinginstanties maken denk ik. Welke functies heb ik nodig in telefoonboek en welke in vermelding? Naar mijn mening kan add_record(); in beide? :S

Ik ga morgen even je voorbeeld goed bestuderen en dan nog s een poging wagen.
 
Jelmer -

Jelmer -

27/03/2008 20:54:00
Quote Anchor link
add_record moet in telefoonboek, je kan niet een record toevoegen aan een vermelding zelf. Wel aan een telefoonboek. En add_record geef je dan een instantie van Vermelding mee als argument, want die wil je immers toevoegen.


Obj-C is eigenlijk een hele handige taal om het idee achter OOP te leren zo gezien. In Obj-C stuur je namelijk 'berichten' naar objecten. Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[telefoonboek addRecord:mijnVermelding];

waarin telefoonboek een instantie is van Telefoonboek, en mijnVermelding een instantie van Vermelding. Je zegt als het ware tegen het telefoonboek dat hij die vermelding moet opnemen. Logischer kan het volgens mij niet.
 
Cedric

Cedric

28/03/2008 09:57:00
Quote Anchor link
Ik heb het nogmaals geprobeerd, hopelijk nu beter...

phonebook.class.php
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
<?php

class Phonebook
{    
    public function __construct()
    {
        
        // Niks?
    }
    
    public function add_record($obj)
    {

        $query = "INSERT INTO persons (name, number) VALUES('".mysql_real_escape_string($obj->name)."', '".mysql_real_escape_string($obj->number)."')";
        $result = mysql_query($query) or die(mysql_error());
        
        if($result)
        {

            return true;
        }

        else
        {
            return false;
        }
    }

        
    public function get_all_records()
    {

        $query = "SELECT id, name, number FROM persons";
        $result = mysql_query($query) or die(mysql_error());
        
        while($row = mysql_fetch_assoc($result))
        {

            $record = new Phonerecord;
            $record->set_id($row['id']);
            $record->set_name($row['name']);
            $record->set_number($row['number']);
            $record->get_record();
            $records[] = $record;
        }

        
        return $records;
    }
            
}


?>


phonerecord.class.php
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
<?php

class Phonerecord
{
    public $id;
    public $name;
    public $number;
    
    public function __construct()
    {

        //
    }
    
    public function set_id($id)
    {

        $this->id = $id;
    }

    
    public function set_name($name)
    {

        $this->name = $name;
    }

    
    public function set_number($number)
    {

        $this->number = $number;
    }

    
    public function get_record()
    {

        $query = "SELECT id, name, number FROM persons WHERE id = '".$this->id."'";
        $result = mysql_query($query) or die(mysql_error());
        
        if(!$result)
        {

            return false;
        }

        else
        {
            $row = mysql_fetch_assoc($result);
        
            $this->id = $row['id'];
            $this->name = $row['name'];
            $this->number = $row['number'];
            
            return true;
        }
    }
}


?>


index.php
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
<?php

include "mysql.class.php";
include "phonebook.class.php";
include "phonerecord.class.php";

$db = new MySQL('localhost', '***', '***');
$db->select_db('***');

if($_SERVER['REQUEST_METHOD'] == "POST")
{

    if(!empty($_POST['name']) && !empty($_POST['number']))
    {

        $phonebook = new Phonebook;
        $obj = new Phonerecord;
        
        $obj->set_name(htmlspecialchars($_POST['name']));
        $obj->set_number(htmlspecialchars($_POST['number']));
        
        if($phonebook->add_record($obj))
        {

            echo 'Your record has been added.<br />';
        }

        else
        {
            echo 'Something went wrong while adding the record.<br />';
        }
    }

    else
    {
        echo 'You need to fill in all the fields.<br />';
    }
}


echo '
<table border="1">
<tr>
<td width="60">Name</td><td width="110">Number</td><td width="30">Detail</td>
</tr>'
;

foreach(Phonebook::get_all_records() as $record)
{

    echo '
    <tr>
    <td>'
.$record->name.'</td><td>'.$record->number.'</td><td align="center"><a href="?id='.$record->id.'">X</a></td>
    </td>
    </tr>'
;
}


echo '</table><br />';
    
?>


<form action="" method="post">
Name: <input name="name" type="text" /><br />
Number: <input name="number" type="text" /><br /><br />
<input name="Submit" type="submit" value="Submit" id="Submit" />
</form>


Nu moet het gewoon goed :S Ik denk dat het redelijk goed gelukt is, behalve bij get_record. Ik had de keuze om zonder argument of met te werken. Ik heb zonder gewerkt omdat get_record() gewoon de gegevens van het huidige object moet hebben. Anders kon ik ook een id als argument meegeven, maar dan kan hij de gegevens van allemaal ophalen. Ik weet niet welke best is, maar ik nam deze omdat ik denk datie enkel de gegevens van zichzelf nodig heeft.
 
Jelmer -

Jelmer -

28/03/2008 13:46:00
Quote Anchor link
De get_record method van PhoneRecord is eigenlijk niet nodig, aangezien je de data al ophaalt in Phonebook. Je voert nu voor ieder record dat je ophaalt een extra - nutteloze - query uit.

Als je de mogelijkheid wilt hebben om individuele records op te halen, zou ik de get_record method verplaatsen naar Phonebook, en hem inderdaad zoals je zelf al zegt een id als argument laten slikken. Bovendien is het voordelig als je deze method naar Phonebook verplaatst, aangezien je dan alle opslag-gerelateerde functies alleen binnen Phonebook hebt, en Phonerecord er niet meer gevoelig voor is (en in theorie, mocht je de database ook via klassen willen gaan doen, niet meer afhankelijk is van een instantie van de database)

Verder zie ik dat je in Phonerecord wel accessors (de get_ en set_ method) hebt, maar je eigenschappen ook public. Accessors zijn er eigenlijk voor bedoeld dat de werking binnenin het object niet naar buiten komt. Dus probeer de eigenschappen zoveel mogelijk protected te houden, en het object van buitenaf alleen via de accessors aan te spreken. Ook binnen phonebook.

Je gebruikt bij je queries 'or die()', terwijl je daarna ook nog controleert of het resultaat wel bestaat (en indien niet, false teruggeeft) Het is een good practice om je klassen zo verlegen mogelijk te maken. Laat ze geen uitvoer echo'en, en zeker geen scripts halverwege afkappen wanneer een query mislukt. Hiervoor kun je sinds PHP 5 heel goed Exceptions gebruiken. Op die manier kan je haperende klassen binnen je script opvangen zonder dat de rest daar last van hoeft te hebben.

In index.php zie ik dat je htmlspecialchars over de gegevens in Phonerecord haalt. Dat heeft als gevolg dat je al opgemaakte data in je database zet. Voor HTML alleen zou dat niet snel problemen opleveren. Maar stel dat je de data ook wilt gaan gebruiken in emailtjes, of in plain text-documenten. Dan is de data die je in je database hebt al 'bevuilt' met HTML. Het is een goed idee om de data zo rauw mogelijk in je database op te slaan, en het escapen van speciale karakters pas te doen wanneer de data wordt weergegeven.
 
Crispijn -

Crispijn -

28/03/2008 14:08:00
Quote Anchor link
Ik maak altijd een altijd eerste een algemene classe waarin in mijn sql verbinding opneem. Ook maak ik een functie waarin in mijn errors opsla, een functie voor het tellen van errors en het weergeven van errors.

Zo kan ik ook netjes de form validatie in mijn classe uitvoeren en krijg ik nette errors op mijn scherm. Alles afvangen is natuurlijk een must. Een debug variabele geeft precies de hoeveelheid aan informatie die de error moet bevatten aan. Ik vind het heel prettig werken, aangezien ik elke classe dus extend met deze standaard classe, en ik mijn output, (bijvoorbeeld jou index.php) enorm kan inkorten. Dit werkt extra snel en makkelijk wat betreft de opmaak.
 
Cedric

Cedric

28/03/2008 17:23:00
Quote Anchor link
Ok, bedankt. Het begint nu een beetje te lukken. Hier nog even de phonebook klasse.

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
<?php

class Phonebook
{    
    public function __construct()
    {
        
        //
    }
    
    public function add_record($obj)
    {

        $query = "INSERT INTO persons (name, number) VALUES('".mysql_real_escape_string($obj->get_name())."', '".mysql_real_escape_string($obj->get_number())."')";
        $result = mysql_query($query);
        
        if($result)
        {

            return true;
        }

        else
        {
            return false;
        }
    }

    
    public function get_record($id, $obj)
    {

        $query = "SELECT id, name, number FROM persons WHERE id = '".$id."'";
        $result = mysql_query($query);
        
        if(!$result)
        {

            return false;
        }

        else
        {
            $row = mysql_fetch_assoc($result);
            
            $obj->set_id($row['id']);
            $obj->set_name($row['name']);
            $obj->set_number($row['number']);            
            
            return true;
        }
    }

        
    public function get_all_records()
    {

        $query = "SELECT id, name, number FROM persons";
        $result = mysql_query($query);
        
        while($row = mysql_fetch_assoc($result))
        {

            $record = new Phonerecord;
            $record->set_id($row['id']);
            $record->set_name($row['name']);
            $record->set_number($row['number']);
            $records[] = $record;
        }

        
        return $records;
    }
            
}


?>

Wat ik nu wel heb is dat ik bij een get_record een instance van een phonerecord moet meegeven. Is dit wel de juiste manier van werken?

Naam weergeven
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$obj
= new Phonebook;
$rec = new Phonerecord;
$obj->get_record(26, $rec);
echo $rec->get_name();
?>
 
Jelmer -

Jelmer -

28/03/2008 17:39:00
Quote Anchor link
Cedric schreef op 28.03.2008 17:23:
Wat ik nu wel heb is dat ik bij een get_record een instance van een phonerecord moet meegeven. Is dit wel de juiste manier van werken?

Het is niet echt nodig. Ik zou get_record de instantie laten aanmaken. Dat scheelt je weer herhalend werk en het is eigenlijk logischer. In je huidige opzet is het meer een fill_record dan een get_record.

Trouwens, je kan nu bijvoorbeeld add_record de klasse van het argument laten afdwingen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
public function add_record(Phonerecord $record) {

Dat maakt je code weer wat leesbaarder en foutjes komen een heel klein beetje sneller aan het licht.

Ow, ik bedenk me net, je kan ook mysql_fetch_object gebruiken. Die accepteert als 2e argument een klasse. Dat scheelt je weer 3 setters aanroepen per object:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
while($record = mysql_fetch_object($result, 'Phonerecord')) {
   $records[] = $record;
}


Sterker nog, nu zou je de set_id-accessor kunnen weglaten. Een id is immers ook niet aan te passen, die is uniek en permanent per record, dus een setter daarvoor hebben is eigenlijk niet logisch.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Cedric

Cedric

28/03/2008 17:56:00
Quote Anchor link
Jelmer schreef op 28.03.2008 17:39:
Het is niet echt nodig. Ik zou get_record de instantie laten aanmaken. Dat scheelt je weer herhalend werk en het is eigenlijk logischer. In je huidige opzet is het meer een fill_record dan een get_record.

Ik liet de functie de instantie aanmaken: $record = new Phonerecord; En dan returnde ik op het einde $record. Maar toen was ik verplicht in het script $record te gebruiken als object inplaats van $rec.
 
Jelmer -

Jelmer -

28/03/2008 18:54:00
Quote Anchor link
Op zich geen probleem toch? Ik kan me niet voorstellen dat je bewerkingen op een Phonerecord-instantie wilt doen voordat je hem vult met de gegevens die erin moeten komen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$rec
= $phonebook->get_record(24);
$rec->set_name('Klaas de 2e');
$phonebook->save_record($rec);
?>

Dat lijkt mij de meest logische en gemakkelijke volgorde.
 
Mark PHP

Mark PHP

28/03/2008 19:56:00
Quote Anchor link
Om methodes zoals get_data, set_name en set_data te voorkomen zou je ook eens kunnen kijken naar de magic methods in PHP5. Staat op deze site een prima tutorial over.
 
Jelmer -

Jelmer -

28/03/2008 20:22:00
Quote Anchor link
Ghehe, heb ik die geschreven? Kan ik me niets van herinneren :P

Anyway, magic methods zijn inderdaad ook een oplossing om je getters & setters te verbergen. Of je ze wilt gebruiken is puur persoonlijk. Ze bieden verder geen voordelen in de zin van snelheid of gebruikersgemak. Zelf geef ik tegenwoordig meer de voorkeur aan ouderwetse methods, omdat je daar al klassen kan afdwingen in de definitie van de argumenten van de method, en de methods mooi naar voren komen in de documentatie en de andere hulpmiddelen zoals Eclipse. Maar een jaar geleden zou ik nog __get & __set gebruikt hebben. Tegenwoordig gebruik ik die alleen nog maar om trucjes als 'lazy loading' en 'chainability' in te kunnen bouwen.
 



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.