Why use OOP?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5 volgende »

Thijs X

Thijs X

06/02/2008 12:12:00
Quote Anchor link
Probeer de namen van classes en methoden zo duidelijk mogelijk te houden, dus de naam "bekijken" is niet erg duidelijk voor een class wat een gastenboek moet voorstellen.
Dan zou ik gaan voor Gastenboek en Reactie.

Nee deze hoeven elkaar niet te extende omdat er hele andere informatie instaat, de klasse gastenboek heeft namelijk een array met reacties erin en daar kan je alle info uithalen mocht dat nodig zijn.
 
PHP hulp

PHP hulp

04/12/2024 20:45:23
 
Joren de Wit

Joren de Wit

06/02/2008 12:15:00
Quote Anchor link
Nee, 'bekijken' is een actie en dat zal dus hooguit een methode van een klasse worden.

Ik zou met minimaal twee klasses starten: Gastenboek en Bericht. Vervolgens ga je in deze klasses allerlei methoden opnemen waarmee je bijvoorbeeld je gastenboek kunt weergeven en berichten kunt toevoegen.

In je Gasteboek klasse zul je gebruik maken van verschillende instanties van de Bericht klasse, die de verschillende berichten voorstellen.
 
Vincent

Vincent

06/02/2008 12:28:00
Quote Anchor link
Oke, ik ga zo aan de slag en het script schrijven.
Niet helemaal aan de hand van dat van Thijs want ik ben het niet eens met het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
# __Constructor
- Deze haalt alle reacties uit de database en maakt objecten aan en plaatst ze in reacties

Ik denk juist eerder dat de constructor moet controleren of er $_GET waarden zijn geset dus of er een paginanummer enzo is geset.
En dat je daarna pas een functie maakt met het ophalen van de gegevens en die apart aanroept maar dat is mijn idee. Dus kan ook helemaal fout zijn :P
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Thijs X

Thijs X

06/02/2008 12:32:00
Quote Anchor link
Ja daar had ik nog niet over nagedacht maar dat is inderdaad een betere oplossing om alleen de data op te halen die je nodig hebt om weer te geven.
 
Crispijn -

Crispijn -

06/02/2008 13:05:00
Quote Anchor link
Ik volg dit topic al sinds het begin. Net zoals Robert programmeer ik ook nog geen OO al vind ik dit wel heel interessant en ben ik mijn spagetti code soms ook wel zat. Dit los ik nu dan wel op door een hoop functies te bouwen maar de kracht van OOP pas ik slechts op wening plaatsen toe. Alleen in delen die ik heb kunnen vinden als download.

Ik wil graag een eigen pagination class bouwen en ben nieuwsgierig naar de uitwerking van Vincent! Ik hou dit topic in de gaten!
 
Joren de Wit

Joren de Wit

06/02/2008 13:37:00
Quote Anchor link
Vincent schreef op 06.02.2008 12:28:
Ik denk juist eerder dat de constructor moet controleren of er $_GET waarden zijn geset dus of er een paginanummer enzo is geset.
Ook niet. De constructor heeft helemaal niets met GET variabelen of andere globals te maken. Zorg ervoor dat je constructor de benodigde parameters accepteert en vul deze parameters pas in als je een instantie van je klasse aanmaakt. Pas op dat moment bepaal je welke variabelen je wilt gebruiken en of dat dus een GET variabele is of dat dat variabelen zijn die ergens anders vandaan komen.

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

        $this->iPage = $iPage;
        $this->display();
    }

    
    public function display()
    {

        // Ga met $iPage aan de slag
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

06/02/2008 14:47:00
Quote Anchor link
@Crispijn: Mijn paginanummering wordt gewoon 1 functie =) dus niet echt een class maar je ziet wel als hij af is..
@Blanche: Ik vat je niet helemaal, "Parameters accepteert" wat bedoel je? En wat doet je voorbeeldje precies? Waarom doe je dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
        $this->iPage = $iPage;
        $this->display(); // en wat doet dit?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Thijs X

Thijs X

06/02/2008 15:03:00
Quote Anchor link
Die $this->display() roept de methode display() aan, deze methode print het hele gastenboek.
 
Joren de Wit

Joren de Wit

06/02/2008 15:03:00
Quote Anchor link
De constructor is de methode uit je klasse die aangeroepen wordt zodra je een instantie van je klasse aanmaakt. In dit geval geef bij het instantieren van je klasse dus 1 parameter mee die het paginanummer voorstelt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$oGastenboek
= new Gastenboek(1);
?>

Vervolgens geeft de construtor de member $iPage (die je op regel 4 declareert) de opgegeven parameter als waarde:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->iPage = $iPage;
?>

Links van de = staat de member en rechts de parameter van de constructor.

Ten slotte een voorbeeldje waarin je in je constructor al de methode display() aanroept. Deze methode zou ervoor zorgen dat de berichten van de betreffende pagina geladen worden en weergegeven worden.

Maar goed, als dit al hocus pocus voor je is, stel ik voor dat je eerst eens op zoek gaat naar wat tutorials.
 
Crispijn -

Crispijn -

06/02/2008 15:28:00
Quote Anchor link
Van alleen al de paginatie kan je al een hele class bouwen toch?

Plaats jij, Vincent, dat nu als object binnen een object?

Ik ben zelf nu deze tut aan het volgen en begin hem toe te passen op mijn paginatie:

Object Oriented Programming in PHP (theorie)

Best duidelijk uitgelegd allemaal!
 
Joren de Wit

Joren de Wit

06/02/2008 15:33:00
Quote Anchor link
Tja je zou er een aparte klasse voor kunnen schrijven, maar het is niet per se nodig. Als je in de klasse Gastenboek het huidige paginanummer beschikbaar hebt, kun je aan de hand daarvan met een eenvoudige methode wel de pagination verzorgen.

ps. Een belangrijke regel die je wel moet onthouden en waar beginners vaak de fout in gaan, is dat klasses in principe geen data naar het scherm schrijven. In een klasse zul je dus ook (bijna) nooit een echo tegenkomen. De enige methoden waarin je dat zou kunnen zien zijn bijvoorbeeld display() methoden, maar het is maar de vraag of je dat zou willen gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

06/02/2008 15:39:00
Quote Anchor link
Wanneer ik de reacties echo heb ik dat toch nodig? bij zoiets:
white(fetchen){
echo $this->naam()
etc.
}
 
Joren de Wit

Joren de Wit

06/02/2008 15:43:00
Quote Anchor link
Niet per se. Je zou er bijvoorbeeld ook kunnen kiezen om enkel een array met alle gegevens terug te geven. Vervolgens kun je deze met php uitlezen of bijvoorbeeld toewijzen aan een template. In dat geval zou je met je template parser ervoor zorgen dat de data uiteindelijk op het scherm komt te staan.

Zodra jij namelijk al vanuit je klasse gaat echoën, leg je de layout ook al in je klasse vast. En dat is nu juist wat je niet wilt. Je wilt dat je klasses zo algemeen mogelijk zijn en dus op verschillende manieren gebruikt kunnen worden.
 
Thijs X

Thijs X

06/02/2008 15:43:00
Quote Anchor link
Vincent schreef op 06.02.2008 15:39:
Wanneer ik de reacties echo heb ik dat toch nodig? bij zoiets:
white(fetchen){
echo $this->naam()
etc.
}


Nee niet op die manier. In je constructor kan je alle gegevens ophalen en vervolgens objecten daarvan maken. En dmv een __toString methode kan je een foreach doen over al die objecten ( Reacties ) die je in een array hebt staan en vervolgens echoen.
 
Jelmer -

Jelmer -

06/02/2008 15:49:00
Quote Anchor link
Kan je in je constructor al alle gegevens ophalen? Heb je al alle gegevens die je nodig hebt om dat te doen, zoals pagina-nummer, aantal posts per pagina?

Ik zou het tonen van het gastenboek trouwens niet onderdeel van de klasse zelf maken, maar dat buiten de klasse oplossen. Je kan een iterator in je Gastenboek-object bouwen om je Bericht-objecten eruit te plukken. Verder heb je alleen maar lees-toegang tot de eigenschappen van het gastenboek (titel, pagina-controller voor nummer) en berichten (naam, bericht) nodig. Als je dit buiten de klasse oplost heb je geen presentatie-onderdeel in je klasse en kan je hem zonder aanpassingen op meer plekken toepassen.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Vincent

Vincent

06/02/2008 17:38:00
Quote Anchor link
Blanche ik ben nu constructor aan te maken

public function __construct(){
$this->gegevens_controle();
}
Die moet ik dus zo laten en dan pas in die gegevens_controle dit:

public function gegevens_controle(){
if(isset($_GET['xdasdasd])){
//dit
}else{
//dat
}
}

Of heb ik je verkeerd begrepen?
 
Joren de Wit

Joren de Wit

06/02/2008 17:43:00
Quote Anchor link
In je klasse wil je helemaal geen GET variabelen gebruiken. Deze zijn immers afhankelijk van het PHP script waarin de klasse gebruikt gaat worden. De controle of de GET variabele bestaat doe je dus ook niet in je klasse maar gewoon in het PHP script waarin je die klasse gebruikt...

In de klasse werk je alleen met variabelen/members die jij zelf aan deze klasse meegegeven hebt of bijvoorbeeld in de klasse gegenereerd of uit een database gehaald hebt.
 
Vincent

Vincent

06/02/2008 17:45:00
Quote Anchor link
Dus dan moet ik vanaf buitenaf zeggen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// eerst controle
$gastenboek->pagina = $_GET['pagina'];
?>


Toch ?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 
Gerben G

Gerben G

06/02/2008 17:48:00
Quote Anchor link
@Vincent
Dat zou betekenen dat pagina een variable is die public is. Normaal gesproken gebruik je voor attributen private of protected. Je kunt ze dan wijzigen met het setter en getter functies
 
Vincent

Vincent

06/02/2008 17:52:00
Quote Anchor link
hoe moet ik dat anders meegeven :S via iets van
class gastenboek($ba,$ba) {
ofzoiets?
Jullie maken 't wel erg moeilijk :-P Lol
En wat maakt het in dit geval trouwens uit of ie public is?
 

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.