Tips eerste OOP scriptje

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front end ontwikkelaar

Functie Het huidige team bestaat uit momenteel uit 5 back end developers verdeeld van senior tot junior. Omdat de gehele front end van applicaties anders gaan insteken zijn ze op zoek naar een ervaren Front end developer die hen kan helpen de juiste keuzes te maken. Je krijgt veel vrijheid om te bepalen hoe je dit wilt ontwikkelen en vrijheid in welke techniek je hiervoor wilt gebruiken. Je zult je dus bezighouden met architectuur, documentatie en natuurlijk ontwikkeling van nieuwe functionaliteiten binnen de verschillende applicaties. natuurlijk heb jij ook mogelijkheden om te sparren binnen het team, maar ze gaan uit

Bekijk vacature »

C# developer

Functie Als C# ontwikkelaar ben jij de spin in het web bij deze organisatie. Jij begeleidt en traint de field engineers die bij de klanten machines leveren en installeren. Daarnaast ondersteun jij de field engineers als zij bij de klant vastlopen bij het installeren van de machine m.b.t. software matige vragen. Jouw doel is dan ook om de technische kennis van de field engineers door middel van training zoveel mogelijk uit te breiden. Dit om ervoor te zorgen dat zij zelfstandiger software matige problemen kunnen oplossen. Ook ben jij verantwoordelijk voor het bedenken van software oplossingen voor klanten en dit

Bekijk vacature »

Backend Developer Integraties API HBO REST

Samengevat: Deze werkgever is een IT-consultancy. Wil jij werken als Backend Developer Integraties? Heb jij kennis van gangbare berichtformaten? Vaste baan: Backend Developer Integraties API HBO €3.100 - €4.400 Zij bieden innovatieve oplossingen die bedrijven efficiënter en wendbaarder maken, waardoor onze klanten zich net zo snel kunnen ontwikkelen als de business van hen vraagt. Bij bij hun werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit als het gaat om de inzet van technologie. Deze werkgever staat open voor elke nieuwe trend. Onze systemen zijn groot en ingewikkeld. Hou jij van diepgang

Bekijk vacature »

Front end developer

Functie Qua type opdrachten is er echt een verscheidenheid aan afnemers, zo werken ze met grote multinationals, maar ook met startups. Zo kom je te werken in een gevarieerde omgeving en kan je ook schakelen tussen verschillende culturen. De projecten variëren van greenfield projecten tot langdurige ontwikkeltrajecten. Hier wordt alleen maar gewerkt met aan front end projecten. Daarom maakt het onze partner niet uit waar jij kennis van hebt, als je maar gedegen kennis hebt van Javascript frameworks, Unit testing en ook bekend bent met de scrum methodiek. Eisen Minimaal 4 jaar relevante werkervaring Kennen en ervaring van Javascript frameworks

Bekijk vacature »

Delphi developer

Functie Als Delphi developer ga jij aan de slag in een team met twee andere ervaren Delphi programmeurs waaronder de Hoofd programmeur. Als team zijn jullie verantwoordelijk voor de doorontwikkeling van jullie bestaande applicatie. Daarnaast zijn jullie verantwoordelijk voor het onderhouden van deze applicatie en het oplossen van eventuele bugs. Eisen - HBO werk en denk niveau; - Minimaal één jaar ervaring met Delphi; - Goede beheersing van de Nederlandse taal in woord en geschrift; - Jij bent zelfstandig, maar kan ook in team verband werken. Aanbod - €3000,-- €4000,- op basis van jouw kennis en ervaring; - 8% vakantiegeld;

Bekijk vacature »

.Net developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als .Net Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Als developer bouw je in DevOps teams aan enterprise applicaties, nieuwe IOT, Chatbots of AI oplossingen. 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 in dit vakgebied. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij vorig jaar Microsoft Partner of the year geworden.

Bekijk vacature »

.NET developer

Functie Als .NET developer start jij in een development team met één Senior .NET developer en één junior .NET developer. Als team zijn jullie verantwoordelijk voor het schrijven van software voor onze toonaangevende Automatiseringssystemen. Jij gaat aan de slag met de onderhoud van de kernsoftware, ondersteund de software van derden door het gebruik van onze webservices en als team zijn jullie verantwoordelijk voor het ontwikkelen van onze backend oplossingen. Wij maken op dit moment veel gebruik van .NET met ASP.NET. Komend kwartaal gaan wij wel gedeeltelijk overstappen naar .NET Core. Verder werken wij ook met SOAP, REST, JSON, HTML5, CSS3

Bekijk vacature »

Database Developer

Functieomschrijving Heb jij ongeveer 3 jaar ervaring als Database Developer met MS SQL of een vergelijkbare database? Wil jij werken voor een ambitieuze werkgever in regio Tilburg waar jij volledig de mogelijkheid krijgt jezelf te ontwikkelen? Lees dan snel verder! Hoe ziet jouw takenpakket eruit? Je gaat projecten gedurende het hele proces begeleiden. Je sluit aan bij afspraken met klanten om hun processen helder te krijgen. Vervolgens voer jij het project uit en zorgt dat dit zo goed mogelijk verloopt; Je werkt aan nieuwe softwareoplossingen die de logistieke processen verbeteren of vernieuwen; Je houdt je bezig met het ontwikkelen van

Bekijk vacature »

Informeel bureau zoekt Senior PHP developer

Functie Als senior PHP developer neem je het voortouw in ontwikkeltrajecten en ben je in staat werk uit te leggen aan collega’s om zo je kennis met hen te delen. Je deinst niet terug voor ingewikkelde projecten. Deze zie jij alleen maar als uit uitdaging. Je werkt doorlopend aan klantcases (en hierdoor je klant echt leert kennen), maar toch ben je afwisselend bezig. Dit alles in een vrije en ontspannen werksfeer, met een team van gelijkgestemde. Binnen de development teams werken ze met o.a. PHP, Laravel, React, Node, Elastic, Amazon AWS, JIRA, Solid, Domain-driven-design, Doctrine, Redis, docker, Kubernetes, CI, PHP

Bekijk vacature »

Creatieve Front-end developer gezocht!

Functie Het front-end team bestaat momenteel uit 4 collega’s en is hard aan het groeien! Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren. Je werkt in het front-end team samen met de back-end teams en product owners om te zorgen dat de applicaties een fijne gebruikerservaring opleveren. Jouw expertise zorgt ervoor dat de juiste keuzes gemaakt worden qua techniek en ontwerp, van back-end tot aan gebruiker. In samenspraak met je team bepalen jullie de beste keuze voor techniek. Ook is er altijd ruimte om nieuwe technieken te ontdekken. Eisen • Je hebt gedegen

Bekijk vacature »

SQL Database ontwikkelaar

Functie omschrijving Wil jij meewerken aan het creëren van slimme software om magazijnen als een geoliede machine te laten lopen? Wij zoeken een zorgvuldig persoon, iemand die niet snel de hand omdraait voor complexe algoritmes. Denk jij dat jij de SQL ontwikkelaar bent die wij zoeken? Lees snel verder en wie weet zitten we binnenkort samen aan tafel! Jouw werkzaamheden zullen er als volgt uitzien: Je houdt je bezig met het ontwerpen en ontwikkelen van MS SQL server databases, dit doe je met T-SQL als programmeer laag. Je gaat aan high-end software oplossingen werken, dit doe je voor de optimalisatie

Bekijk vacature »

C# .NET Software Ontwikkelaar

Functie omschrijving C# .NET Developer gezocht. Ben jij een full stack developer die op zoek is naar een nieuwe uitdaging binnen een leuk snel groeiend bedrijf? Lees dan snel verder! Wij zijn op zoek naar een Developer met ervaring op het gebied van .NET die een organisatie in de regio Arnhem gaat versterken. Jij gaat je binnen dit bedrijf vooral bezighouden met het verbeteren van de functionaliteiten van hun dataplatform. Samen met andere ontwikkelaars denk je mee in oplossingsrichtingen, architectuur en nieuwe technologieën. Als C# .NET Developer binnen dit bedrijf houd je je niet alleen bezig met het verbeteren van

Bekijk vacature »

Senior .NET Ontwikkelaar

In het kort Als Senior .NET ontwikkelaar ga je binnen onze business unit Transport en Logistiek aan de slag met complexe maatwerk software voor bedrijf kritische systemen binnen de technische automatisering. Denk bijvoorbeeld een IoT-oplossing voor de logistieke sector waarbij we van ruim 200.000 machines de telemetrie en events verwerken. We zijn actief in de distributielogistiek, havenlogistiek (denk aan ECT) en productielogistiek. Naast C# en .NET Core maken we ook gebruik van Azure technologie. En als trotse Microsoft Gold Partner leren we graag van en met jou. Wil jij jezelf blijven ontwikkelen binnen de technische automatisering met .NET, dan gaan

Bekijk vacature »

BizTalk/ Azure Developer

Dit ga je doen •Understanding the scope of required functionality, translate them within context of way of working of the team into developed solutions, whilst safeguarding documentation; •Planning based on assigned sprint tasks; •Acting as an expert in estimation techniques and planning; •Understanding your role in the agile process and act in this way; •Facilitating internal communication and effective collaboration; •Working closely with scrum master to handle backlogs and new requests; •Providing information to the third parties about activities and needs for compliance. Hier ga je werken Our client is a leading organization focusing on animal nutrition, offering solutions that

Bekijk vacature »

Front-end developer (Angular)

Functie Het team bestaat uit een architect, fullstack developers, app developers, de product owner en projectmanager. Eenieder draagt vanuit zijn discipline bij aan een complete oplossing voor de klant. Uiteraard zul je hierin nauw samenwerken met je collega’s. Jij wordt verantwoordelijk voor de front-end implementatie en fungeert als lead op dit gebied binnen het team. Je kunt helder formuleren, ideeën uitdragen en overbrengen aan je collega’s. Qua technische stack is het vooral van belang dat je ervaren bent met Angular, HTML5, CSS en TypeScript. Verder is ervaring in NgRx, Bootstrap, BEM en Cypress een pré, evenals affiniteit met UX/UI Design!

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

25/04/2024 20:00:01
 
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.