[PHP-OOP]Gegevens uit een database sleuren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tha_Butcha
  • Registratie: November 2000
  • Laatst online: 20-01 18:05
Ik ben bezig met een encylopedie te maken in PHP, waarvan alle info in een MySQL database staat. Om nog een beetje netjes te programmeren wilde ik het toch maar OO doen, da's uit eindelijk makkelijker, en dan leer ik er nog wat van. Alleen betwijfel ik of mijn huidige manier wel goed is.

Alle gegevens over een item heb ik nl. als propery van een object gemaakt, die ik steeds laat bewerken vanuit een functie. Misschien onduidelijk omschreven, dus ik zal ff wat code snippets hier neer planten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class item {

function item {
    $this->itemID;
    $this->itemName;
    $this->itemDescription;
    // gaat zo een tijdje door zijn ong. 25 properties, strings, booleans en arrays door elkaar

}

function insertDB {

  $inserter = new SQL ($DB_HOST,$DB_NAME, $DB_USER, $DB_PASS);

  $sql = ("INSERT INTO tblItem (itemName,itemDescription) ($iName,$iDescription)");

  // deze query is dus ook heel uitgebreid omdat ik er ong 25 dingen in wil stoppen

  $inserter->query($sql);

}

} // End of Class


Mijn vraag is dit, of dit vanuit OOP oogpunt - en voor zover mogelijk met PHP-, wel netjes is en of dit niet een aanslag is op de performance van de server?

Compromises are for the weak


Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

OO is imho beter dan !OO.

Ik zou de aparte db classe die je nu al gebruikt globaal maken, zo heeft geen enkele andere classe de gegevens nodig voor een login en leg je maar 1 verbinding naar de server per script request. Dus ipv $inserter = new SQL.... wordt het $GLOBALS['db']->query($sql);

Ja, OO in PHP is NOG (PHP5 misschien niet meer) wel langzamer, maar inderdaad beter onderhoudbaar.

Nee, het zal geen aanslag zijn op je server tenzij je een miljoenenpubliek verwacht, maar dat is dan ook zo zonder OO.

Verder zou ik ook iets maken om fouten af te vangen. Die regel $inserter zou een boolean terug moeten geven of het inserten wel of niet gelukt is. Dan kan je terugkoppelen (en loggen) wat er fout gaat.

[ Voor 6% gewijzigd door Jurgle op 11-11-2003 19:18 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

Verwijderd

Volledig OOP heeft zeer zeker voordelen. Zoals je zelf al opmerkt heeft het wel wat impact op de performance, maar dat neem je normaliter op de koop toe. Als er verder efficient geprogrammeerd wordt dan moet ook dat wel redelijk mee kunnen vallen.

Het is echter wel zaak netjes te programmeren. Er vallen mij al meteen een aantal dingen aan jouw code op:

properties definieer je in de constructor. Is op zich niks mis mee, maar een meer gebruikelijke aanpak is het definieren van deze properties als variabele binnen de klasse (evt een standaard waarde geven). In de constructor kun je dan alsnog deze properties bewerken. Vaak wordt er nog een initialisatie methode gebruikt, die opnieuw bij een bestaand object gebruikt kan worden.

Verder definieer je in de methode insertDB ineens een compleet nieuw object. Deze komt zomaar uit de lucht vallen als het ware en heeft ook alleen maar function scope. Misschien dat je dat object (of liever gezegd een referentie naar dat object) beter kunt definieren als een property van de klasse ;) . Tenzij je natuurlijk 100% zeker weet dat je het alleen binnen deze methode gaat gebruiken, maar ook dan geldt nog altijd het nu volgende stukje ;)
Daarnaast is het waarschijnlijk handig om dat een referentie te laten zijn naar het SQL object dat globaal gebruikt worden. Een lelijke oplossing is het gebruik van global een nettere oplossing is het naar binnen halen van de referentie.

Klasses behoor je klein/compact en overzichtelijk te houden. Als jij 25 properties aan een object toe wil kennen, dan moet je eens goed gaan kijken of je klasse niet veel te groot is en opgedeeld dient te worden in meerdere klassen.

Verdiep je in referenties. Nu kopieer je elke keer een waarde. $inserter is bijvoorbeeld een kopie van het object dat je erachter creeert terwijl je het hoogstwaarschijnlijk een referentie wilt laten zijn. Zeker als je straks met heel veel klasses gaat werken, wil je het echt niet allemaal kopieen laten zijn van objecten ;)
Dit staat allemaal keurig uitgelegd op www.php.net ;)

[ Voor 6% gewijzigd door Verwijderd op 11-11-2003 19:25 ]


Acties:
  • 0 Henk 'm!

  • Tha_Butcha
  • Registratie: November 2000
  • Laatst online: 20-01 18:05
allereerst, thx voor de snelle reacties!
Nee, het zal geen aanslag zijn op je server tenzij je een miljoenenpubliek verwacht, maar dat is dan ook zo zonder OO.
ging vooral om die properties dat die goed gingen, maar ik heb ze ff verrot gedefineerd zoals nelske zei.
Verder zou ik ook iets maken om fouten af te vangen. Die regel $inserter zou een boolean terug moeten geven of het inserten wel of niet gelukt is. Dan kan je terugkoppelen (en loggen) wat er fout gaat.
Ik ben ook bezig met een algemene error en debug class, alleen die heb ik hier nog niet in ondervangen, maar thx voor het opmerken.
Het is echter wel zaak netjes te programmeren. Er vallen mij al meteen een aantal dingen aan jouw code op:

properties definieer je in de constructor. Is op zich niks mis mee, maar een meer gebruikelijke aanpak is het definieren van deze properties als variabele binnen de klasse (evt een standaard waarde geven). In de constructor kun je dan alsnog deze properties bewerken. Vaak wordt er nog een initialisatie methode gebruikt, die opnieuw bij een bestaand object gebruikt kan worden.
nu ik het zo zie is het idd. niet errug netjes oipgelost; heb een hele tijd niet meer geprogrammeert, en heb java gedaan en ben toen naar perl en php gegaan, allebei zeer ranzig in verhouding tot java. maar die shit is zo ver weg gezakt, echt zo'n 3 jaar niet gebruikt. Daarom vroeg ik het ook hier, zodat ik weer een beetje fatsoenlijk leer programmeren.

maar heel globaal zou dit dus beter moetne zijn:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class foo {

  var $fooID;
  var $fooName;

  function foo() {

    $this->fooName = "bar";

  }

}
Verder definieer je in de methode insertDB ineens een compleet nieuw object. Deze komt zomaar uit de lucht vallen als het ware en heeft ook alleen maar function scope. Misschien dat je dat object (of liever gezegd een referentie naar dat object) beter kunt definieren als een property van de klasse . Tenzij je natuurlijk 100% zeker weet dat je het alleen binnen deze methode gaat gebruiken, maar ook dan geldt nog altijd het nu volgende stukje
dat zei Jurgle idd. ook al, was ik nog niet opgekomen, toch maar 'es ff referenties gaan doorploegen dan, en ff me boekjes er op na slaan.
Klasses behoor je klein/compact en overzichtelijk te houden. Als jij 25 properties aan een object toe wil kennen, dan moet je eens goed gaan kijken of je klasse niet veel te groot is en opgedeeld dient te worden in meerdere klassen.
die properties zijn allemaal data, dus ik zit nou ineens te bedenken dat die data maar 1 property is, en daar misschien die 25 dingen in kan flikkeren; lijkt me OOP technisch gezien netter.

* Tha_Butcha verder met lezen gaat op php.net en boekjes nalezen gaat.

Compromises are for the weak