OOP goed of fout
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
require ("./inc/connect.php");
class kamer {
public function get_all($kamer_id) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
while ($row = mysql_fetch_object($q_checkkamer)) {
$this->straat = $row->straat ;
$this->straat_num = $row->straat_num ;
$this->onderhoud = $row->onderhoud ;
$this->postcode = $row->postcode ;
// enz..
}
}
}
$kamerid = 1 ;
$kamer = new kamer() ;
$kamer->get_all ($kamerid);
echo $kamer->straat.'<br>' ;
echo $kamer->straat_num .'<br>' ;
echo $kamer->onderhoud .'<br>' ;
echo $kamer->postcode ;
?>
require ("./inc/connect.php");
class kamer {
public function get_all($kamer_id) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
while ($row = mysql_fetch_object($q_checkkamer)) {
$this->straat = $row->straat ;
$this->straat_num = $row->straat_num ;
$this->onderhoud = $row->onderhoud ;
$this->postcode = $row->postcode ;
// enz..
}
}
}
$kamerid = 1 ;
$kamer = new kamer() ;
$kamer->get_all ($kamerid);
echo $kamer->straat.'<br>' ;
echo $kamer->straat_num .'<br>' ;
echo $kamer->onderhoud .'<br>' ;
echo $kamer->postcode ;
?>
Het werkt prima maar is dit ook zoals het bedoeld is? Zou je de variabelen ook kunnen zetten door middel van een foreach statement met alle kolommen.
bijv:
Ik hoor het graag of ik in de goede richting zit te borduren :)
Topic verplaatst naar het juiste board.[/modedit]
Gewijzigd op 29/05/2011 17:14:20 door Joren de Wit
Met $this-> stel je de instantievariabelen in. Die heb je nu nog niet aangemaakt. Deze kun je vlak na het openen van de klasse neer zetten. Hierbij heb je ook 3 mogelijkheden voor de scope van de variabelen: private, protected en public.
Let wel op dat als je de variabelen private maakt, dat ze enkel binnen de klasse zelf bereikbaar zijn! Dus dan kun je ze ook niet bereiken met:
Daarintegen worden er vaak getters en setters gemaakt. Iets wat mijn persoonlijke voorkeur ook is, maar daar kun je over twisten natuurlijk.
Dan krijg je dus:
Nu denk je misschien: wat omslachtig. Lijkt het misschien ook, maar alle velden in je klasse public maken is een echte bad-practice! Je loopt vanzelf een keer tegen problemen aan. De getStraat() methode die ik hier boven geplaatst heb is daarintegen WEL public, want die moet je in andere klassen kunnen aanroepen om de naam van de straat (van die instantie) te verkrijgen.
Zelfde krijg je dan met een setter method:
In je code maak je een while-lus voor de resultaten van je query. Hiermee suggereer je dat de query meerdere resultaten zal geven. Als er meerdere resultaten zijn, overschrijft hij de oude waarden gewoon.
Ik neem aan dat de ID de primary key in je tabel is en deze kan dus maar 1 keer voor komen. Je zal dan ook altijd maar maximaal 1 record terug krijgen. Een while lus is dan overbodig.
Want een object (class) heeft eigenschappen (properties) en door middel van methods kun je deze veranderen.
I.p.v. setVariabele en getVariabele kun je ook de magic methods __set en __get gebruiken.
Daarnaast is dit volgens mij niet heel erg goed OOP, maar zo'n OOP deskundige ben ik niet. Want een straat is geen eigenschap van een huis, maar een huis wel van een straat. Je zou dus ook een object (class) straat moeten maken waarvan je het huis op kan halen.
Maar nu heb ik het dus anders aangepakt met de __get variabel in de get.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
Alleen hoe krijg is de $kamerid in de class? Ik heb het ook met call__ geprobeerd omdat je er dan 2 variabelen in kunt zetten, maar dit zijn alleen variabelen die in de class gemaakt zijn. Maar ik heb een 'externe' variabel nodig.
Alvast bedankt
Kima
Toevoeging op 29/05/2011 15:38:19:
Ki ma op 29/05/2011 14:58:41:
Bedankt voor de reacties! Ik snap het nu alweer een stuk beter.
Maar nu heb ik het dus anders aangepakt met de __get variabel in de get.
Alleen hoe krijg is de $kamerid in de class? Ik heb het ook met call__ geprobeerd omdat je er dan 2 variabelen in kunt zetten, maar dit zijn alleen variabelen die in de class gemaakt zijn. Maar ik heb een 'externe' variabel nodig.
Groet
Kima
Maar nu heb ik het dus anders aangepakt met de __get variabel in de get.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
Alleen hoe krijg is de $kamerid in de class? Ik heb het ook met call__ geprobeerd omdat je er dan 2 variabelen in kunt zetten, maar dit zijn alleen variabelen die in de class gemaakt zijn. Maar ik heb een 'externe' variabel nodig.
Groet
Kima
Gewijzigd op 29/05/2011 14:59:45 door ki ma
Ki ma op 29/05/2011 14:58:41:
Bedankt voor de reacties! Ik snap het nu alweer een stuk beter.
Maar nu heb ik het dus anders aangepakt met de __get variabel in de get.
Alleen hoe krijg is de $kamerid in de class? Ik heb het ook met call__ geprobeerd omdat je er dan 2 variabelen in kunt zetten, maar dit zijn alleen variabelen die in de class gemaakt zijn. Maar ik heb een 'externe' variabel nodig.
Alvast bedankt
Kima
Toevoeging op 29/05/2011 20:49:47:
*del*
Toevoeging op 29/05/2011 20:50:01:
*del*
Maar nu heb ik het dus anders aangepakt met de __get variabel in de get.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
class kamer {
var $kamer_id = '1' ;
// of bijv: var $kamer_id = $kamer_id ; maar dit mag niet werken...
function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamer_id . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamerid = 3;
$kamer = new kamer();
echo $kamer->straat . '<br>';
?>
Alleen hoe krijg is de $kamerid in de class? Ik heb het ook met call__ geprobeerd omdat je er dan 2 variabelen in kunt zetten, maar dit zijn alleen variabelen die in de class gemaakt zijn. Maar ik heb een 'externe' variabel nodig.
Alvast bedankt
Kima
Toevoeging op 29/05/2011 20:49:47:
*del*
Toevoeging op 29/05/2011 20:50:01:
*del*
Code (php)
Enkele principes die doorgaans veel genoemd worden zijn DRY (Don't Repeat Yourself) en KISS (Keep It Simple, Stupid).
Je moet er voor zorgen dat elke functie maar 1 doel heeft. Op die manier kun je ze vaker in je code aanroepen (herbruikbaarheid).
Als ik naar je klasse Kamer kijk, doe je 2 dingen in je functie. Je haalt de gegevens uit de database en returnt een waarde. Kortom, elke keer als je een instantievariabele opvraagt wordt er een query uitgevoerd. Lijkt me niet echt de meest ideale oplossing.
Wat me een logischere oplossing lijkt, is om de ID (waarmee je een kamer uit de database haalt) als parameter aan je constructor te geven. Vervolgens haal je in de constructor de gegevens uit de database en stel je de instantievariabelen daar mee in.
Vervolgens heb je de __get methode om de instantievariabelen een voor een op te vragen.
Gewijzigd op 29/05/2011 21:50:40 door Erik van de Locht
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
class kamer {
public $kamerid;
private function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamer = new kamer();
$kamer->kamerid = 1;
echo $kamer->straat . '<br>';
?>
class kamer {
public $kamerid;
private function __get($name) {
$sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$q_checkkamer = mysql_query($sql_checkkamer);
$row = mysql_fetch_object($q_checkkamer);
if (isset($row->$name)) {
return $row->$name;
}
}
}
$kamer = new kamer();
$kamer->kamerid = 1;
echo $kamer->straat . '<br>';
?>
Ik moest dit "$kamer->kamerid = 1;" nog doen om de $var binnen de class te krijgen.
Gewijzigd op 29/05/2011 21:51:07 door ki ma
Nog steeds heb je niet goed door wat __get doet en ik zie nog niks terug van de tips van erik en mij.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
class kamer {
public function __construct($kamer) {
$this->kamerid = $kamer;
$this->sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$this->q_checkkamer = mysql_query($this->sql_checkkamer);
$this->row = mysql_fetch_object($this->q_checkkamer);
}
private function __get($name) {
if (isset($this->row->$name)) {
return $this->row->$name;
} else {
return null;
}
}
}
$kamer = new kamer(1);
echo $kamer->straat . '<br>';
?>
class kamer {
public function __construct($kamer) {
$this->kamerid = $kamer;
$this->sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$this->q_checkkamer = mysql_query($this->sql_checkkamer);
$this->row = mysql_fetch_object($this->q_checkkamer);
}
private function __get($name) {
if (isset($this->row->$name)) {
return $this->row->$name;
} else {
return null;
}
}
}
$kamer = new kamer(1);
echo $kamer->straat . '<br>';
?>
De magic method __get moet public zijn. Die methode gebruik je immers om de velden op te vragen. Bij mij geeft hij zelfts een warning als ik hem private maak.
Op regel 6 en 7 stel je variabelen in als instantievariabelen. Behoorlijk overbodig.
Zie de instantievariabelen als 'iets wat het object fisiek echt heeft'.
Zo heeft een Persoon een naam, leeftijd, BSN nummer, etc. Je kunt nou niet echt zeggen dat een Kamer een select query heeft. Gewoon een normale variabele van maken dus, net als de select handler van de query die je uit voert.
De instantievariabelen die je nu instelt werken wel, maar ze zijn standaard altijd public! Ofwel de __get methode is nog al overbodig omdat je alles alsnog gewoon met
kunt benaderen.
Bovenaan je code de instantievariabelen instellen als private. Zie de voorbeelden die ik eerder gaf.
En nog een laatste tip, gebruik duidelijke namen voor variabelen. Ik snap dat je met 'row' het resultaat uit de database bedoelt, maar maak er dan eerder iets van 'kamerinformatie' van, dat werkt veel gemakkelijker. Anders zie je door de bomen het bos niet meer als je code wat groter wordt.
Erik
Code (php)
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
28
29
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
28
29
<?
class get_kamer {
private $sql_checkkamer;
private $q_checkkamer;
private $kamer_info;
private $kamerid;
public function __construct($kamer) {
$this->kamerid = $kamer;
}
private function getrow() {
$this->sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$this->q_checkkamer = mysql_query($this->sql_checkkamer);
$this->kamer_info = mysql_fetch_object($this->q_checkkamer);
}
public function __get($name) {
$this->getrow();
if (isset($this->kamer_info->$name)) {
return $this->kamer_info->$name;
} else {
return null;
}
}
}
$kamer = new get_kamer(1);
echo $kamer->straat . '<br>';
?>
class get_kamer {
private $sql_checkkamer;
private $q_checkkamer;
private $kamer_info;
private $kamerid;
public function __construct($kamer) {
$this->kamerid = $kamer;
}
private function getrow() {
$this->sql_checkkamer = "SELECT * FROM kamers WHERE id = '" . $this->kamerid . "'";
$this->q_checkkamer = mysql_query($this->sql_checkkamer);
$this->kamer_info = mysql_fetch_object($this->q_checkkamer);
}
public function __get($name) {
$this->getrow();
if (isset($this->kamer_info->$name)) {
return $this->kamer_info->$name;
} else {
return null;
}
}
}
$kamer = new get_kamer(1);
echo $kamer->straat . '<br>';
?>
Nu is het dus zo. Ik heb de select variabelen even gesplitst om het overzichtelijker te maken. Verder heb ik de variabelen nu private gemaakt in de class zelf.
Bedoel je met:
"Gewoon een normale variabele van maken dus, net als de select handler van de query die je uit voert." dat ik hem bijvoorbeeld zo moet aanvragen:
Maar dan vervalt een beetje het nut van de class. Het was de bedoeling dat ik hierdoor snel en gemakkelijk kamer informatie kan opvragen ipv iedere keer de hele sql select regels hoef toe te voegen..
Gewijzigd op 30/05/2011 16:08:14 door ki ma
Helemaal OOP is deze class ook nog niet,
Tip: Een functie (of methode) doet maar één.
Een class is een verzameling functies die 1 onderwerp hebben.
Stukje theorie:
Je wilt iets over een kamer maken, kamers ophalen, kamers opslaan. Waarin een database of een tekst bestand ?
oftewel.
Dit is heel globaal hoor ;), dus niet direcht kopieren en plakken en hopen dat het werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class kamer {
private $kamerid;
private $kamernaam;
private $db;
public function __construct() {
$this->db = new db();
}
public function getKamer($kamerid) {
return $this->db->fetch("SELECT * FROM kamers WHERE kamerid = '" . $kamerid ."');
}
public function getKamers() {
return $this->db->fetch("SELECT * FROM kamers");
}
public function addKamer($kamernaam) {
$this->db->query("insert into kamers (kamernaam) values (" . $kamernaam . ")");
}
}
?>
class kamer {
private $kamerid;
private $kamernaam;
private $db;
public function __construct() {
$this->db = new db();
}
public function getKamer($kamerid) {
return $this->db->fetch("SELECT * FROM kamers WHERE kamerid = '" . $kamerid ."');
}
public function getKamers() {
return $this->db->fetch("SELECT * FROM kamers");
}
public function addKamer($kamernaam) {
$this->db->query("insert into kamers (kamernaam) values (" . $kamernaam . ")");
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class db {
private $connection;
public function __construct() {
$this->connection = mysql_connect(USERNAME, PASSWORD, HOST, DATABASE);
}
public function fetch($qry) {
return mysql_fetch_array($this->query($qry));
}
public function query($qry) {
return mysql_query($qry, $this->connection);
}
}
?>
class db {
private $connection;
public function __construct() {
$this->connection = mysql_connect(USERNAME, PASSWORD, HOST, DATABASE);
}
public function fetch($qry) {
return mysql_fetch_array($this->query($qry));
}
public function query($qry) {
return mysql_query($qry, $this->connection);
}
}
?>
En dit is nog maar het begin, geen fout afhandeling. niet optimale. In plaats van enkele variabelen mee sturen in functies kan je ook classes of structs mee sturen. maar het idee is er.
Op deze manier kan je wanneer je "data laag" oftewel de database veranderd 1 ding aanpassen en het werkt. allemaal nog. En dat omdat functies van elkaar on afhankelijk zijn.
edit: kak alles weg ? dan maar overnieuw
Gewijzigd op 31/05/2011 22:36:41 door Thijs -
Quote:
Een class is een verzameling functies die 1 onderwerp hebben.
Nee, niet echt... Een klasse is een verzameling data en functies die op een object betrekking hebben. Object, niet onderwerp.
kamer#addKamer() is onlogisch: hoe kan je aan een kamer een kamer toevoegen
Kamer::add(); is in mijn opzicht wel een goede manier.
Waarschijnlijk doel jij op een class Huis waar je kamers aan toe kan voegen. Ben ik het eigenlijk wel mee eens.