Beginnen met OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michael Beers

Michael Beers

16/07/2010 02:05:17
Quote Anchor link
Beste helpers,

Ik ben eigenlijk pas begonnen met OOP en ik vroeg me af wat jullie van mijn basis code vinden ik wil hier met de tijd mits er weinig op aan te merken is iets van een cms op gaan bouwen maar dan moet ik wel weten in hoeverre hij stabiel is :).

Dus als jullie mij willen helpen door mijn code is te gaan bekijken zou ik dit heel fijn vinden.
Kraak me maar helemaal af daar leer ik weer van :)

Download link

Met vriendelijke groeten,

Michael Beers
 
PHP hulp

PHP hulp

25/04/2024 20:52:19
 
Pim -

Pim -

16/07/2010 02:08:34
Quote Anchor link
Probeer inhoudsvolle naamgeving te gebruiken. index.php $pl?

Scheid je MVC lib van je application code.

Vermijd public vars.

De Api klasse is incorrect, elke klasse hoort 1 taak te hebben, dit is de bootstrap en loader tegelijk.

Config is incorrect. De data hoort in een een textfile te staan, xml of ini oid, en de config klasse hoort deze toegankelijk te maken.

Je moet met exceptions werken, op deze manier maak je alles afhankelijk van Api. De database klasse hoort daar niets van af te weten.

De error suppression in de database klasse hoort daar echt niet...

De URL klasse hoort Route(r) oid te heten.

Wees consistent: Views hoort View te zijn

Gebruik nooit extract()
Dat maakt je variabelen onvindbaar en het creëert snel fouten.

De __destruct() functie in Views is raar.

Wat in index.php gebeurt moet in een frontcontroller gebeuren.

Kortom goed dat je met OOP bezig bent en je commentaar is wel goed ;), maar een MVC framework is geen goed begin.
Gewijzigd op 16/07/2010 02:27:21 door Pim -
 
Michael Beers

Michael Beers

16/07/2010 12:54:36
Quote Anchor link
Probeer inhoudsvolle naamgeving te gebruiken. index.php $pl?
Hier heb ik nu $pageloader van gemaakt...
De variable was inderdaad slordig inelkaar gezet

Scheid je MVC lib van je application code.
Ik snap hiermee niet wat je bedoeld... zoals hierboven vermeld i'm a beginner :)
Zou je me dit een beetje gedetaileerder willen uitleggen

Vermijd public vars.
Ik weet dat dit fout is ;) dit wou ik later nog gaan doen.
Voormezelf vind ik dit prettig werken om eerst alles public te maken en daarna pas te gaan kijken wat gebruikt de classe zelf en wat word er extern opgehaald enz.

De Api klasse is incorrect, elke klasse hoort 1 taak te hebben, dit is de bootstrap en loader tegelijk.
Ik snap hiermee niet wat je bedoeld... zoals hierboven vermeld i'm a beginner :)
Zou je me dit een beetje gedetaileerder willen uitleggen

Je moet met exceptions werken, op deze manier maak je alles afhankelijk van Api. De database klasse hoort daar niets van af te weten.
Kan je me enige uitleg hierover geven?
Ik weet wel hoe je een exception gebruikt hoor maar heb er tot nu toe nooit het nut van ingezien omdat een if{} else {} makkelijker is

De error suppression in de database klasse hoort daar echt niet...
Deze error is inderdaad lelijk gedaan net als dat ik ben vergeten de connectie te sluiten in de destructor die nog niet aanwezig is

De URL klasse hoort Route(r) oid te heten.
Waarom want er moet daar een verklaring voor zijn :) ikzelf vond de naam URL wel makkelijk

Wees consistent: Views hoort View te zijn
Ga ik aanpassen

Gebruik nooit extract()
Dat maakt je variabelen onvindbaar en het creëert snel fouten.

Zijn hiervoor goeie alternatieven om dit te doen?

De __destruct() functie in Views is raar.
Ik zat er zelf ook over te twijvelen of dit verstandig was maar nu hoor ik het dus van een ander dat dit niet het geval is :)

Wat in index.php gebeurt moet in een frontcontroller gebeuren.
Hierbij bedoel je dat ik in de index eigenlijk gewoon geen stuk script moet houden
Maar alleen een referentie naar een classe in dit geval de frontcontroller die de taak verder overneemt...?



Harstikke bedankt voor het bekritiseren ik wil het mezelf nu gewoon goed aanleren want dit is gewoon nuttig in zowel: as3.0, java, c+ etc.
 
Pim -

Pim -

17/07/2010 22:17:50
Quote Anchor link
Michael Beers op 16/07/2010 12:54:36:
Scheid je MVC lib van je application code.
Ik snap hiermee niet wat je bedoeld... zoals hierboven vermeld i'm a beginner :)
Zou je me dit een beetje gedetaileerder willen uitleggen
De MVC library is het gedeelte dat de applicatie mogelijk maakt, het regelt de abstracte controllers, de frontcontroller, die de juiste controller aanroept en het kan nog veel meer bevatten, zoals een database abstractie, een session handler of een authenticatie en authorisatie handler. Je applicatie code is de controllers zelf en uiteraard de modellen.

De Api klasse is incorrect, elke klasse hoort 1 taak te hebben, dit is de bootstrap en loader tegelijk.
Ik snap hiermee niet wat je bedoeld... zoals hierboven vermeld i'm a beginner :)
Zou je me dit een beetje gedetaileerder willen uitleggen
Volgens de OOP principes (http://www.phptuts.nl/view/45/) moet elk object zijn eigen taak te hebben. Maak dus een Bootstrap (opstart-code) klasse (maak een abstracte bootstrap in je lib, die alle methoden in de concrete bootstrap in je applicatie aanroept, in index.php doe je dus gewoon iets als $bootstrap->run()), een loader klasse (kies voor een autoloader of een handmatige loader (Loader::load('Een_Klasse'))).

Je moet met exceptions werken, op deze manier maak je alles afhankelijk van Api. De database klasse hoort daar niets van af te weten.
Kan je me enige uitleg hierover geven?
Ik weet wel hoe je een exception gebruikt hoor maar heb er tot nu toe nooit het nut van ingezien omdat een if{} else {} makkelijker is
Het leuke van exceptions is, dat ze teruggegooid worden. Wanneer een exception gegooit wordt, gaat php net zo lang terug tot een catch blok wordt gevonden. Zo kan je fouten afhandelen zoals jij dat wilt. Je moet sowieso een catch blok maken helemaal buitenaan (in index.php bijvoorbeeld) die onverwachte fouten afhandelt, maar je kan het ook veel lager vangen (bijvoorbeeld als de validatie van user input faalt).

De error suppression in de database klasse hoort daar echt niet...
Deze error is inderdaad lelijk gedaan net als dat ik ben vergeten de connectie te sluiten in de destructor die nog niet aanwezig is
Het sluiten van verbindingen is vaak onnodig, dit gebeurt toch automatisch aan het eind van de code. Het is waarschijnlijk zelfs sneller wanneer dit automatisch gebeurt. Probeer sowieso niet zo veel destructors te gebruiken. Wanneer in andere objecten referenties aanwezig zijn naar een object met een destructor, wordt de destructor op een onverwacht moment aangeroepen. Je kan het beter in een normale methode stoppen.

De URL klasse hoort Route(r) oid te heten.
Waarom want er moet daar een verklaring voor zijn :) ikzelf vond de naam URL wel makkelijk
Dat is eigenlijk meer gewoonte. Een URL klasse wordt meestal gebruikt om URL te construeren. In MVC-taal heet de betreffende functionaliteit de router.

Gebruik nooit extract()
Dat maakt je variabelen onvindbaar en het creëert snel fouten.

Zijn hiervoor goeie alternatieven om dit te doen?
Gewoon de array-items zelf aanroepen $array[$key] ...

Wat in index.php gebeurt moet in een frontcontroller gebeuren.
Hierbij bedoel je dat ik in de index eigenlijk gewoon geen stuk script moet houden
Maar alleen een referentie naar een classe in dit geval de frontcontroller die de taak verder overneemt...?
In index.php moet je eigenlijk een frontcontroller klasse aanroepen die het werk doet dat nu in index.php staat. Ja dus. Echte code in index.php is volgens OOP fout, het hoort slechts een bootstrap te zijn (opstart-code).

Duidelijk?
 
Michael Beers

Michael Beers

17/07/2010 22:23:28
Quote Anchor link
Is het heel slecht als ik zeg nee :$ ik begin net met OOP dus dat is nog even een trap te hoog gegrepen denk ik
Ik snap wel wat je bedoelt maar het uitvoeren ervan kan ik niet bedenken...
Het zou top zijn om een voorbeeld te sturen vanuit mijn code maar dit kost denk ik veel werk
 
Pim -

Pim -

17/07/2010 22:35:27
Quote Anchor link
Dan ben ik bang dat dit te hoog gegrepen is voor je. Begin eens met een basaal domain model met active record (elk model regelt zijn eigen opslag). Dat is volgens mij de makkelijkste manier om met OOP te beginnen. Je maakt het domain model, dit is de applicatie code waar het eigenlijk om draait, denk aan:
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
<?php
class Gastenboek
{
    public function postBericht(User $user, Bericht $bericht)
    {

        $bericht->setUserId($user->getId());
        $bericht->save();
    }
}

class Bericht
{
    public function setUserId($id)
    {

        $this->_userId = $id;
    }


    public function save()
    {

        $db = Database::getInstance(); // Database is singleton: http://www.devshed.com/c/a/PHP/The-Singleton-and-Factory-Patterns-in-PHP-Building-objectoriented-forms/1/
        $this->_id = $db->insert('berichten', array(
            'inhoud' => $this->_content,
            'user_id' => $this->_userId,
        ));
// Een database abstractie (leuk om te maken trouwens), eerste argument is de tabel, tweede is een array met de velden
    }
}

?>

Zo kan je volgens mij het beste OOP leren.
Gewijzigd op 17/07/2010 23:03:52 door Pim -
 
Michael Beers

Michael Beers

17/07/2010 22:53:19
Quote Anchor link
Oké dus wat ik eignelijk moet doen is een classe maken voor mijn MVC wat in mijn geval nu in de index staat en vervolgens is mijn api een factory in de controller...?
is dat het geen wat jij bedoelt?
 
Pim -

Pim -

17/07/2010 23:00:52
Quote Anchor link
Nee, wat ik bedoel is dat je beter niet met OOP kan beginnen met een MVC. Begin met datgene dat ik in mijn vorige bericht zei.
 
Niels K

Niels K

17/07/2010 23:08:41
Quote Anchor link
Leuk blog reeks om te beginnen met toepassen in oop

http://development.blog.markkazemier.nl/category/oop-gastenboek/
 
Michael Beers

Michael Beers

17/07/2010 23:32:53
Quote Anchor link
Harstikke bedankt voor de hulp iedereen en ik denk dat ik nu het licht heb gevonden :) ik ga het herschrijven en dan wacht ik op jullie reacties
 
Pim -

Pim -

19/07/2010 03:05:27
Quote Anchor link
Commentaar op je nieuwe versie, die je hopelijk snel hier post:

De landingsplek hoort de enige public directory te zijn. De rest kan beter buiten de document root komen of, als dit niet mogelijk is, in een afgeschermde map. Die andere index.php in de root is dus een beetje raar.

Ik vind je naamgeving niet zo mooi. Probeer met echte of desnoods met fake( A_B_C ) namespaces te werken.

Bootstrapping is niet slechts het includen van files, het gaat o.a. meer om het laden van configs en het maken een database verbinding. Let op dat dit ook in OOP moet gebeuren. Het laden van files kan beter met een autoloader gebeuren.

De .class.php naamgeving slaat nergens op: in een OOP applicatie zijn alle files klassen.

Je cache is slecht. Deze hoort te kunnen weken met zowel filecache, db cache en cache in het geheugen of op zijn minst de mogelijkheid bieden dat deze door de gebruiker zelf gemaakt moet worden. Dit wordt de backend genoemd. De frontend wordt aangeroepen en deze roept de backend dan aan om de daadwerkelijke opslag te verzorgen. Tip: maak voor de backend een interface. Cruciaal bij een cache is natuurlijk het verwijderen van data en het hebben van een verloopmoment.

Gebruik NOOIT het global keyword in OOP!

Zoals ik al zei, vertrouw niet op __destruct(). Roep de code expliciet aan.

De hele controller is raar. In de lib hoort een abstracte (expliciet: dus abstract class) klasse te zitten die vooral het koppelen aan de view en eventuele helpers (redirect bijv) te regelen. De code die je nu hebt in de constructor hoort in de frontcontroller te gebeuren.

De rest kijk ik nog wel naar als ik tijd heb.
 
Michael Beers

Michael Beers

19/07/2010 19:59:35
Quote Anchor link
Ja ik zal hem nu direct posten :)
Ik heb nogmaals een poging gedaan tot het schrijven van een goeie MVC frame maar blijkbaar zitten er nog wat haken en ogen ik post gewoon alles wat ik heb zodat andere er van kunnen leren want ik ben vast niet de enige met dit probleem!

Download Link
 



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.