Beginnen met een Class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Albert de Wit

Albert de Wit

16/12/2013 12:21:14
Quote Anchor link
Hallo,

Ik wil een class schrijven omdat een functie voor mijn doel hier te klein voor is. Mijn class ziet er nu zo uit (schematisch):

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 Classname{
    public $id_item;
    public $properties;
    public $relations = array();

    public function __construct($id_item){
        /*get the id of the item*/
        $this->id_item = $id_item;
        $this->get_item_properties();
    }


    public function get_item_properties(){
        /*get all properties from the database*/
        $query = $mysqli->query("SELECT * FROM table WHERE id_item = '".$this->id_item."'");
        $this->properties = $query->fetch_assoc();
    }


    public function get_item_relations(){
        /*get all relations to this item*/
        $query = $mysqli->query("SELECT id_user FROM table_item_users WHERE id_item = '".$this->id_item."'");
        while ($row = $query->fetch_assoc()){
            array_push($this->relations,$row['id_user']);
        }
    }
}

?>


Ik wil deze class oproepen met
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
$item
= new Classname($id_item);

/*get properties*/
echo $item->properties['id_item'];
echo '<br />';
echo $item->properties['id_author'];

/*get relations*/
echo '<pre>';
print_r($item->relations);
echo '</pre>';
?>


Doe ik het correct op deze manier?
Gewijzigd op 16/12/2013 12:32:52 door Albert de Wit
 
PHP hulp

PHP hulp

23/11/2024 23:36:34
 
Erwin H

Erwin H

16/12/2013 12:30:26
Quote Anchor link
Zo te zien zal er wel iets mis gaan.

Je queries hebben helemaal geen connectie met welke database dan ook.
Op regel 10 roep je de niet bestaande methode set_item_properties aan.
Op regel 23 push je een element in de niet gedefinieerde property id_users

En verder nooit publieke properties gebruiken. Echt de doodsteek voor je classes en voornamelijk het toekomstig onderhoud van je applicaties.

Maar wat is je doel van deze class, in welke omstandigheid wil je het gebruiken etc?
Gewijzigd op 16/12/2013 12:31:52 door Erwin H
 
Albert de Wit

Albert de Wit

16/12/2013 12:36:28
Quote Anchor link
Ik wil het includen in bepaalde pagina's van mijn projectje. Omdat ik vaak deze gegevens moet ophalen wilde ik het zo makkelijk mogelijk maken. Natuurlijks zijn relations en properties een paar van de gegevens die ik wil hebben. Veel van de pagina's in mijn projectje moeten veel overeenkomstige gegevens ophalen maar andere moeten weer een paar gegevens extra hebben dan andere pagina's. Toen pas dacht ik te begrijpen waar het OOP echt om draait met classes.
 
Erwin H

Erwin H

16/12/2013 12:59:11
Quote Anchor link
Als het alleen voor je huidige project is (goed overnadenken!), dan kan je best een standalone class gebruiken. Bovenstaande punten blijven alleen wel geldig.

Waar ik in elk geval nog wel naar zou kijken is om het misschien niet meteen een volwaardige OOP class te maken, maar in elk geval om er een aparte database class naast te hebben die het hele process van data uit je database halen kan overnemen. Daar heb je zeker ook in je volgende projecten heel veel aan. Dat moet dan dus wel een class zijn die niets, maar dan ook niets project specifieks doet. Die class kan je dan in bovenstaande class gebruiken om de specifieke gegevens op te halen die je nu nodig hebt.
 
Albert de Wit

Albert de Wit

16/12/2013 13:02:02
Quote Anchor link
Sorry Erwin, ik volg het niet helemaal, kun je een voorbeeld geven? Wat bedoel je met een standalone class? En waarom een apparte database class? Is die class voor ALLE verkeer tussen databases? Of is die class voor alleen voor aanpassingen in een database?
 
Erwin H

Erwin H

16/12/2013 14:18:56
Quote Anchor link
Tel eens hoe vaak je in bovenstaande class een query uitvoert, gegevens uitleest (en error afhandeling zou moeten hebben)? En dat is nog maar 1 class. Als je dezelfde code voor elke query gaat schrijven zal je al snel merken dat je veel te vaak hetzelfde doet. De meeste scripters hebben daar geen zin in en schrijven dus algemene code die je elke keer weer kan gebruiken. Dat is de basis waarom OOP is uitgevonden, maar zelfs zonder volledig een OOP applicatie te ontwikkelen kan je al van die voordelen gebruik maken. Dus 1 class die de connectie met de database beheert, de queries kan uitvoeren, fouten kan afhandelen en de gevraagde gegevens kan teruggeven in een standaard array formaat. Hoef je die alleen nog maar elke keer aan te roepen. Als je het goed doet is elke volgende query 1 regel code.

Met stand alone class bedoel ik dat je nu gewoon een class hebt die specifiek voor 1 doel is gebouwd in je huidige applicatie. Daarmee is die class niet herbruikbaar, maar kan nog steeds wel nuttig zijn op dit moment.
 
Albert de Wit

Albert de Wit

16/12/2013 14:23:13
Quote Anchor link
Oké, ik denk dat ik je begrijp!. Zou je alleen nog een voorbeeld willen geven over hoe ik zo'n query-code zou kunnen schrijven.
 
Erwin H

Erwin H

16/12/2013 14:42:53
Quote Anchor link
Tuurlijk kan ik dat doen, maar zoals jezelf in een ander topic niet al te lang geleden al zei: daar leer je niet zoveel van.

Wat je beter kan doen is eens wat oude code pakken en 3, 4, 5, misschien nog wel meer stukjes code waarin je een volledige database call uitvoert eruit halen. Zet die onder elkaar, bekijk wat de overeenkomsten zijn en al die overeenkomsten wil je dus in die nieuwe class hebben. Denk daarbij overigens ook aan de verschillen tussen insert/update/delete queries enerzijds en select queries anderzijds.

In principe kan je in 1 methode alles afhandelen, in de praktijk heb ik ervaren dat het handiger is het te splitsen. Ik doe het in 4 (setQuery, setParameters, executeQuery, getResults/getAffectedRows), waarbij er in feite ook nog meerdere opties zijn voor de executeQuery methode, omdat je soms wel resultaten ophaalt en soms dus niet.
Gewijzigd op 16/12/2013 14:43:18 door Erwin H
 
Albert de Wit

Albert de Wit

16/12/2013 15:05:07
Quote Anchor link
Oke, dus als ik het goed begrijp, zou ik een sql class moeten maken zodat ik met een paar parameters een hele query uitvoer. Hmmm, ik zal even wat proberen, het klinkt namelijk wel bekend in de oren. Bedankt!
 



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.