Why use OOP?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5 volgende »

Joren de Wit

Joren de Wit

06/02/2008 17:54:00
Quote Anchor link
Nee, het liefst wil je ook niet dat members uit je klasse van buitenaf te benaderen zijn. Je maakt ze dus protected en zorgt dat je ze ofwel met je constructor initialiseert ofwel set functies daarvoor gebruikt.

Een klein voorbeeldje:
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
<?php
class Gastenboek
{
    protected $iPage;
    
    public function __construct($iPage)
    {

        $this->iPage = $iPage;
    }

    
    public function getPage()
    {

        return $this->iPage;
    }

    
    public function setPage($iPage)
    {

        $this->iPage = $iPage;
    }
}


$oGastenboek = new Gastenboek(19);
echo 'You are on page '.$oGastenboek->getPage().'<br />';

$oGastenboek->setPage(20);
echo 'You are on page '.$oGastenboek->getPage().'<br />';
?>
 
PHP hulp

PHP hulp

26/04/2024 01:29:05
 
Vincent

Vincent

06/02/2008 17:57:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
public function __construct($iPage)

Die variabele $iPage in dit stukje hierboven krijgt dus automatisch de waarde 19 of in andere geval 20 ?
 
Joren de Wit

Joren de Wit

06/02/2008 18:01:00
Quote Anchor link
Nee, de member $iPage krijgt de waarde die jij bij het instantiëren van je klasse opgeeft. Zie regel 22 uit mijn voorbeeldje...

Als je namelijk een nieuwe instantie van een klasse aanmaakt wordt altijd de methode __construt() van die klasse uitgevoerd. Nu accepteert deze methode 1 parameter $iPage. De waarde van deze parameter wordt vervolgens door de functie toegekend aan de member $iPage van de klasse.

Met behulp van de methode setPage() die ik op regel 25 aanroep, geef ik daar de member $iPage een nieuwe waarde. Dat valt ook te zien in de verschillen in output als je het scriptje runt.
 
Vincent

Vincent

06/02/2008 20:05:00
Quote Anchor link
Ik ben vastgelopen >_<
Al tijd mee bezig maar lukt niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// deze heb ik public gezet
    public $fetch;

// en hier haal ik alles op

$this->sql = "SELECT * FROM berichten";
$this->gegevens = $this->db->query($this->sql);    
foreach($this->gegevens as $fetch){
    return $this->fetch;
}

?>


In het gewone php gedeelte heb ik dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$gastenboek = new gastenboek($pagina_nummer);
$gastenboek->weergeven();
print_r($gastenboek->fetch);

Alleen nu weergeeft hij niks..
Als ik ipv return $this->fetch; gewoon echo $this->fetch; doe doet hij het wel, maar dan weergeeft hij alles uitzichzelf meteen dat is niet de bedoeling.. ziet iemand wat ik fout doe?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Crispijn -

Crispijn -

06/02/2008 20:09:00
Quote Anchor link
Je hebt nergens een LIMIT opgenomen in je query?
 
Joren de Wit

Joren de Wit

06/02/2008 20:11:00
Quote Anchor link
Het is allereerst niet slim om een return aan te roepen in je foreach loop. Dan stopt de loop namelijk direct na de eerste return. Als dit verder je hele script is klopt het niet. Waarom zijn je methoden bijvoorbeeld gebleven? Laat dat ook eens zien...

Je foreachloop zelf klopt ook niet. Zoals gezegd al vanwege die return, maar ook zet je de inhoud van de array in een variabele $fetch die je vervolgens niet meer gebruikt?

In je PHP script roep je een methode weergeven() aan? Waar is die methode?

ps. @Crispijn: dat mag niets uitmaken. Nu worden gewoon alle berichten opgehaald...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

06/02/2008 20:19:00
Quote Anchor link
ik heb maar klein stukje gepost dat lijkt me logisch want je krijgt normaal ook: Post relevante code om je hoofd geslingerd. Maar blanche ik wil alle gegevens in een array weggeven zodat ik ze kan aanpassen in gewone script zodat ik layout niet hoef op te nemen in mn oop stuk, hoe doe ik dat?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Thijs X

Thijs X

06/02/2008 20:25:00
Quote Anchor link
Vincent schreef op 06.02.2008 20:19:
ik heb maar klein stukje gepost dat lijkt me logisch want je krijgt normaal ook: Post relevante code om je hoofd geslingerd. Maar blanche ik wil alle gegevens in een array weggeven zodat ik ze kan aanpassen in gewone script zodat ik layout niet hoef op te nemen in mn oop stuk, hoe doe ik dat?


Normaal gesproken bij procedureel programmeren is dat handiger idd, maar in het geval van OOP is het wat handiger om te zien hoe je alles hebt opgebouwd en dus ook de methoden post.
 
Joren de Wit

Joren de Wit

06/02/2008 20:29:00
Quote Anchor link
Quote:
Post relevante code om je hoofd geslingerd.
Klopt, maar in dit geval zijn dat wel degelijk relevante onderdelen ;-)

Maar goed, je kunt tijdens het fetchen toch gewoon een array aanmaken en deze vervolgens retourneren?
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
<?php
public function getMessages()
{

    // Query uitvoeren en checken...
    
    $aMessages = array();
    while($row = mysql_fetch_assoc($res))
    {

        $aMessages[] = $row;
    }

    
    return $aMessages;
}

?>

Of natuurlijk aangepast naar de werking van jouw database klasse.

ps. In je PHP script zou je de array dus zo verkrijgen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$aBerichten
= $oGastenboek->getMessages();
?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

06/02/2008 20:32:00
Quote Anchor link
Oke thijs en blanche voortaan post ik wel alles bij oop =)
@Blanche, omg ik ben zo dom dat ik daar niet aan gedacht heb =) ik ga t meteen maken =)
 
Vincent

Vincent

06/02/2008 21:21:00
Quote Anchor link
Yea! :D
Mn eerste stuk is af!
Het bekijken alle gegevens =D( nog wel zonder paginanummering )
Heb erg mn best op gedaan =) hoor graag commentaar en natuurlijk ook positieve reacties.
Hier is ie dan!
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
<?php

class gastenboek
{
    protected $aantal_paginas;
    protected $sql;
    protected $db;
    protected $gegevens;
    public $fetch;
    public $berichten;
    public $row;
  
    public function __construct($pagina)
    {

        $this->pagina = $pagina;
        $this->connectie();
    }

    
    protected function connectie(){
        try{
            $this->db = new PDO('pgsql:host=sterretjes;dbname=sterretjes', 'sterretjes', 'sterretjes');
        }

        catch(PDOException $e)
        {

            echo $e->getMessage();
        }
    }

    
    public function weergeven()
    {

        if($this->num_rows() == 0){
            echo "Er zijn nog geen berichten ingevoegd.";
        }
else{
            $this->sql = "SELECT * FROM berichten";
            $this->gegevens = $this->db->query($this->sql);    
            foreach($this->gegevens as $fetch){
                    $berichten[] = $fetch;            
            }
    
            return $berichten;    
        }
    }


    public function num_rows()
    {

        try
        {    
            $this->sql = "SELECT count(id) AS aantal FROM berichten";
            $this->aantal_paginas = $this->db->query($this->sql);
            foreach($this->aantal_paginas as $row){
                return $row['aantal'];
            }
                
        }

        catch(PDOException $e)
        {

              echo $e->getMessage();
        }
    }


    public function getpagina()
    {

            return $this->pagina;
    }

    
    public function setpagina($pagina)
    {

        $this->pagina = $pagina;
    }
}


$gastenboek = new gastenboek($pagina_nummer);
$gegevens = $gastenboek->weergeven();

foreach($gegevens as $gegevens_naar_browser){
    echo "
        ID "
.$gegevens_naar_browser['id']."#<br />
        Door: <a href=\"mailto:"
.$gegevens_naar_browser['email']."\">".$gegevens_naar_browser['naam']."</a>
        Op: "
.$gegevens_naar_browser['datum']."<br />
        Bericht: <br />"
.$gegevens_naar_browser['bericht']."
        <br /><br />
         "
;
}


?>


P.s Misschien zitten er nog wat schoonheidsfoutjes in die ik ben vergeten eruit te halen
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Joren de Wit

Joren de Wit

06/02/2008 21:38:00
Quote Anchor link
Allereerst, dit ziet er netjes uit voor een beginner! Om er maar even doorheen te lopen:

Regel 5-12: De member $sql is niet nodig. De query stel je op in een variabele in een methode, hier hoef je geen class member voor te gebruiken. Je zult dezelfde query immers niet in andere methoden gebruiken. Zelfde geldt voor $gegevens. Verder gebruik je $fetch en $row en $berichten nergens dus die zijn overbodig.

Regel 26: een typisch beginnersfoutje, een echo wil je liever niet in je klasse hebben. Ofwel je gooit hier een nieuwe exception ofwel je gebruikt hier nog geen try/catch combinatie en laat een eventuele PDOException nog even onafgevangen.

Regel 33: zelfde als hierboven. In zo'n geval zou je een Exception moeten gooien.

Regel 35-36: gebruik hier gewoon $sql en $gegevens. Nergens voor nodig om class members te gebruiken.

Regel 49: het lijkt me dat $aantal_paginas een integer moet zijn. Ga aan deze member in ieder geval niet het resultaat van deze query toekennen, gebruik gewoon $result oid.

Regel 57: zelfde als regel 26.

Regel 72-83: Giet dit in een try/catch constructie en vang de gegooide Exceptions (evt. PDOException) af.

Dit zijn allemaal kleine beginnersfoutjes, er zitten gelukkig geen grote constructie fouten in. Netjes hoor...
 
Vincent

Vincent

06/02/2008 21:56:00
Quote Anchor link
Allereerst bedankt voor je leuke reactie =) !

Regel 5-12 - Ik heb ze gedelet =)

Regel 26, Regel 33, Regel 57 - Wat bedoel je hier precies? Gewoon dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
try
{    
}

catch(PDOException $e)
{

      echo $e->getMessage();
}

?>


veranderen naar

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
try
{    
}

?>


of naar

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
// niks dus
?>


Regel 72-83 - Toegevoegd !
 
Joren de Wit

Joren de Wit

06/02/2008 22:01:00
Quote Anchor link
Je zou ervoor kunnen kiezen om de try/catch constructie daar gewoon weg te laten. In dat geval moet je in je PHP script het wel zo aanpakken:
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
<?php
try
{
    $oGastenboek = new gastenboek($pagina);
    // Doe dingen met je gastenboek
}
catch(PDOException $e)
{

    // Handel je PDOException af
}
catch(Exception $e)
{

    // Handel eventuele andere Exceptions die je
    // gegooid hebt af...

}
?>


In het geval van regel 32 zou je de echt door zoiets moeten vervangen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
throw new Exception('Er zijn nog geen berichten');
?>


Je moet er in ieder geval voor zorgen dat alle Exceptions die ooit gegooid kunnen worden, ergens in je script afgevangen. Anders krijg je een erg lelijke foutmelding en dat wil je niet ;-)
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

06/02/2008 22:17:00
Quote Anchor link
Oke meeste is gefixt alleen nog die throw new maar die doe ik morgen =)
Bye
 
Crispijn -

Crispijn -

06/02/2008 22:17:00
Quote Anchor link
Wow ziet er chique uit Vincent! Ik ga eens pluizen. Ben nu even The NET aan het kijken om te zien wat er allemaal kan gebeuren als je op sites zit zoals phphulp :P

Die exeptions, dat is eigelijk een soort vuilnisbak waar je al je errors in verzameld? En waarom spoor je die op met try? je kan toch gewoon heel duidelijk de 'spaghetti methode' gebruiken. Dus

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    if(!$res){
    //hier in een vuilnisbak gooien
    }
?>


of is dat niet zoals het in classes gedaan wordt? of komt dat doordat Vincent een pdo klasse gebruikt?

Ben benieuwd!

Cris
 
Joren de Wit

Joren de Wit

06/02/2008 22:25:00
Quote Anchor link
In een try/catch constructie ga je in de try allerlei bewerkingen proberen uit te voeren. Zolang alles goed gaat is er niets aan de hand. Maar zodra er ergens een fout optreedt en er een Exception gegooid wordt, wordt de uitvoer gestopt en de Exception afgevangen als er een bijbhorend catch-statement aanwezig is.

Het geven van foutmeldingen als er bijvoorbeeld geen berichten zijn, doe je dus ook niet met een echo maar je gooit een Exception. Bij het uitvoeren van je script met je try/catch combinatie kun je deze afvangen en bepalen hoe je de fout af wilt handelen.

Exceptions in PHP5

Zie ook dit en volgende hoofdstukken in mijn tutorial over foutafhandeling in PHP.
 
Crispijn -

Crispijn -

06/02/2008 23:01:00
Quote Anchor link
Pfoe! Ik ga er even een nachtje over slapen. Dit vat ik niet 123. Morgen maar even verder met inlezen!

Slaap wel allemaal! Morgen weer een dag OOP ;)
 
Robert Deiman

Robert Deiman

06/02/2008 23:34:00
Quote Anchor link
Maar als ik het goed begrijp kan je ook zo'n constructie maken, waarbij bla en bla2 elk een andere exeption zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    try{
        if(bla){
            throw Exeption.....
            }

        if(bla2){
            throw Exeption....
            }
        }

    catch(Exeption $e){
       echo $e;
       }

?>

Waarbij je in het catch blok zowel de 1e als 2e exeption te zien krijgt als die hem gooit? Hij maakt er een soort van array van ofzo?
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Thijs X

Thijs X

07/02/2008 00:10:00
Quote Anchor link
@ Robert,

Zover ik weet kan je alleen de eerstvoorkomende Exception terugkrijgen.
Want zodra er een exception word gethrowed kapt die ermee en gaat die naar het catch blok.
 

Pagina: « vorige 1 2 3 4 5 volgende »



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.