[disc/php] OO programming

Pagina: 1
Acties:
  • 125 views sinds 30-01-2008
  • Reageer

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Een poosje geleden ben ik begonnen met OBP[1] in PHP. De meest de libraries heb heb ondertussen wel omgezet naar een objectgebaseerde vorm. Ontertussen ben ik benieuwd naar hoe je een hele site objectgeorienteerd aanmaakt. Mijn eerste probleem was: Hoe maak je je main-object? Begin je iedere request met: $main = new MainApplication, of sla je je main ergens op of zo, en roep je die aan? (meer de serverlet methode).

Vervolgens: hoe ontwerp je zo'n site? Maak je session Objecten, Request Objecten en Response Objecten? Wat heeft dat vervolgens voor invloed op de performance op je site? Kortom: wat zijn jullie ervaringen.


[1] OBP = Object Based Programming, programmeren door gebruik te maken van objecten vanuit niet-object georienteerde code. VBScript is doorgaans OBP, net als javascript.

offtopic:
Reden van vragen is dat ik binnenkort een (zeer) grote site moet gaan bouwen met slechts weinig functionaliteit. Ideaal voor een OOP beginnetje...

Localhost, sweet localhost


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Mijn ervaring is dat procedureel programmeren in PHP toch een stuk lekkerder gaat. Het ontwikkelen van goede, gestructureerde libraries voor PHP in object georienteerde omgeving kost ongelooflijk veel tijd, en zijn vaak toch niet generiek genoeg om te hergebruiken (behalve wanneer je 't over een MySQL interface hebt, ofzo).

Maar om terug te komen op de vragen:
Hoe maak je je main-object? Begin je iedere request met: $main = new MainApplication, of sla je je main ergens op of zo, en roep je die aan? (meer de serverlet methode).
Eigenlijk zou je dat m.i. met een static member van een object moeten doen, inderdaad, zoals het in Java gebeurt. Aan de andere kant heeft het niet erg veel zin om de "main" in een method te zetten, denk ik. Kan me er in PHP iig niet goed een voorstelling van maken wat voor voordeel 't heeft.
hoe ontwerp je zo'n site? Maak je session Objecten, Request Objecten en Response Objecten?
Het mooiste is het om daar een library voor aan te maken. Ik denk dat een site tot heel ver door geabstraheerd kan worden. Je hebt het over requests aan een database, of een andere datasource, de verwerking van de data, en de output. Je zou het eigenlijk tot zover door moeten kunnen drijven dat je voor bijvoorbeeld datasources een interface schrijft, die vervolgens de "mal" is voor alle datasource objecten. Kunnen schrijven naar en lezen uit de datasource objecten gaat dan voor elk datasource object op de zelfde manier, en kun je dus verschillende soorten databases (MySQL, Postgres) en andere vormen (XML) uitwisselbaar inzetten. Besluit je om een bepaalde source van een site XML te laten zijn, verander de input van je main-app naar een XML-datasource en klaar is kees...
Een net templatesysteem aan de output kant is dan ook niet verkeerd. Hoewel ik overigens nog steeds denk dat PHP zelf de beste template-taal is, zou je ook daarvoor verschillende vormen kunnen bedenken. Zolang je er maar een goede interface voor definieert ;)

Ik laat me een beetje gaan, merk ik. :+

Maar dat is ongeveer de richting die je imho op moet denken/kijken. De vraag vooraf is echter, of het haalbaar is met de huidige OO implementatie van PHP, en misschien met de volgende (Zend2) engine... Ik denk dat het haalbaar is, maar aan de andere kant denk ik (nog steeds) niet dat PHP daar erg geschikt voor is.
Wat heeft dat vervolgens voor invloed op de performance op je site?
Ben ik nooit nagegaan, maar ik kan me voorstellen dat 't wel iets aan performance inlevert als je alles OO probeert te maken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Misschien kun je ook eens kijken naar de opzet van ASP.NET. Dit kun je omzetten naar PHP. In ASP.NET is ook alles OO. Zo wordt er bijv. eerst een HTTPRequest object gemaakt die wordt ontvangen door een HTTPRequestHandler. Hierna gaat het door een bepaalde sink heen (kijk eens naar het chain of responsibility design pattern). Hierin kan elk object in de sink een aanpassing maken. Ook wordt elke pageview omgezet in een Page class. Als client erf je over van deze Page klasse, en kun je reageren op bepaalde events ( ik weet niet in hoevere PHP dit kan implementeren :) ) zoals page load, button1_click.
Je kunt dit zo uitgebreid maken als je wilt, zoals ook drm al liet merken :) , maar als kern vind ik het bovenstaande een goed begin. Het probleem is echter altijd statemanagement: je kunt niet tussen pagina's je objecten behouden. Je zult dus elke keer objecten moeten instantieeren. Er zijn natuurlijk wel truukjes om objecten te behouden tussen requests ( zo had ik laatst een geheel objectmodel met serialize() in een formfield opgeslagen :) ), maar de hoofdregel blijft dat je alles vaak weer opnieuw moet opzetten.
Ook kun je de structuur van servlets bestuderen maar hier heb ik nog nooit mee gewerkt.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Verwijderd schreef op 09 september 2002 @ 13:00:
Zo had ik laatst een geheel objectmodel met serialize() in een formfield opgeslagen :)
Serializen is niet betrouwbaar.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class doubleLinkedListNode {
   var $left = null;
   var $right = null;

   function insertAfter(&$object) {
      if($right !== null) {
         $this->right->left=&$object;
         $object->right=&$this->right;
      }
      $object->left = &$this;
      $this->right = &$object
   }   
}

$a = new doubleLinkedListNode();
$b = new doubleLinkedListNode();
$a.insertAfter($b);

$c = deserialize(serialize($a));


In het bovenstaande voorbeeld is $c geen exacte kopie van $a. De references kloppen niet. oorzaak: PHP serialization kan niet omgaan met recursieve references.

Localhost, sweet localhost


Verwijderd

kvdveer schreef op 09 september 2002 @ 09:32:
Mijn eerste probleem was: Hoe maak je je main-object? Begin je iedere request met: $main = new MainApplication, of sla je je main ergens op of zo, en roep je die aan? (meer de serverlet methode).
Ik heb geleerd om dat eerste te doen, ik begon altijd met een page object, waar alles wat er verder toe doet in dat page object staat. Dingen als database connectie en checks voor of een gebruiker is ingelogd (en zo ja, welke) e.d. stonden allemaal in de page object en werden aangemaakt als ik new Page() deed.
Vervolgens: hoe ontwerp je zo'n site? Maak je session Objecten, Request Objecten en Response Objecten? Wat heeft dat vervolgens voor invloed op de performance op je site? Kortom: wat zijn jullie ervaringen.
Nee... Ik maak gewoon een stel classes en daarnaast losse functies. Classes zijn alleen classes als dat zinvol is, dus als je informatie per object wilt bewaren (net als in java e.d.). Denk hierbij aan page object, database object, ingelogde user object, etc. Session is niet echt een class waard omdat PHP al die informatie zelf al voor je bewaard. Ik had voor dingen als session variabelen daarom gewoon losse functies, get_post_var() e.d., niet in een class, omdat dat namelijk niet zinvol is imho. Wat voegt een class toe aan losse functies?

Oftewel, objecten voor zover dat zinnig is, en verder niet.

Elke pagina bestond vervolgens simpelweg uit:

code:
1
2
3
4
5
6
7
<?php
$page  = new Page("titel van deze pagina");
?>
inhoud van de pagina
<?php
$page->close();
?>


Maargoed, classes zijn dus enorm handig, maar gebruik ze waar ze goed voor zijn. Verder niet. :Y).

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

beelzebubu:
Classes zijn alleen classes als dat zinvol is, dus als je informatie per object wilt bewaren (net als in java e.d.). Denk hierbij aan page object, database object, ingelogde user object, etc. Session is niet echt een class waard omdat PHP al die informatie zelf al voor je bewaard. Ik had voor dingen als session variabelen daarom gewoon losse functies, get_post_var() e.d., niet in een class, omdat dat namelijk niet zinvol is imho. Wat voegt een class toe aan losse functies?
Waarom zou je dan wel een database-class hebben? Of bevat de database-class een interface als 'getTitle ( $pageID )' ofzo?
Oftewel, objecten voor zover dat zinnig is, en verder niet.
Ben ik het dus niet helemaal mee eens. Classes kun je in PHP ook als 'namespaces' gebruiken, voor zover je classes aanmaakt waar je maar 1 instantie van nodig hebt.
Elke pagina bestond vervolgens simpelweg uit:

code:
1
2
3
4
5
6
7
<?php
$page  = new Page("titel van deze pagina");
?>
inhoud van de pagina
<?php
$page->close();
?>

Maargoed, classes zijn dus enorm handig, maar gebruik ze waar ze goed voor zijn. Verder niet. :Y).
In dit geval begrijp ik je niet helemaal. Je zei dat je aan de Page een database koppelt, etc. Maar je geeft de title van de Page mee in de constructor. Lijkt me vreemd, gezien 't m.i. logischer is om de title uit de database te halen? ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

drm schreef op 10 september 2002 @ 11:50:
Waarom zou je dan wel een database-class hebben? Of bevat de database-class een interface als 'getTitle ( $pageID )' ofzo?
Goeie vraag. ;). Ik had net zo goed het database connectie object in de page class kunnen zetten en geen database class maken. Maar ik (of eigenlijk: mijn groep) koos ervoor om dat in een aparte class te doen en dan enkele usability functies erbij te doen. Zoiets als getTitle() dus.

Is eigenlijk een beetje natte vinger werk. Ik kan me niet meer helemaal herinneren waarom we er nou een aparte klasse voor maakten, maar uiteindelijk vonden we dat wel een beter idee. :P.

Als ik 't goed heb moesten we meerdere keren in de database inloggen, soms als anonymous (simpele GET queries) en soms als user (dus om informatie in te voeren). Om security redenen hebben we die twee gescheiden, en om dat makkelijk te maken hebben we de database class gemaakt, geloof ik...

De database class had dus enkele variabelen om aan te geven als wie we waren ingelogd, had enkele functies om dingen makkelijk toe te voegen, login/logout functies en nog wat andere prut... Omdat dat wat veel was om allemaal in 't page object te proppen hebben we dat in een aparte class gegooid. Zoiets was het geloof ik... :D.

/me wordt vergeetachtig. 8)7.
Ben ik het dus niet helemaal mee eens. Classes kun je in PHP ook als 'namespaces' gebruiken, voor zover je classes aanmaakt waar je maar 1 instantie van nodig hebt.
Klopt... Kwestie van smaak eigenlijk. ;).
In dit geval begrijp ik je niet helemaal. Je zei dat je aan de Page een database koppelt, etc. Maar je geeft de title van de Page mee in de constructor. Lijkt me vreemd, gezien 't m.i. logischer is om de title uit de database te halen? ;)
Titels stonden bij ons eigenlijk gewoon in de PHP pagina's. Dus help.php had new Page("Hellup") en index.php had new Page("Welkom op onze hoompeetsj"), zoiets. Als je erover nadenkt is het eigenlijk net zo logisch om 't op jouw manier te doen...

Ohwell, we kregen er een 10 voor dus mij hoor je niet zeuren. :Y).
Pagina: 1