[OOP] Variabelen
Ik ben een beetje aan het spelen met OOP en heb een vraag over variabelen.
Stel ik heb dit nutteloze script:
Moet ik in dit geval persé met public/protected/private variabelen werken? Of kan het ook gewoon zo.
Dus als je een variabelen alleen in dat object gebruikt, moet je dan die ook public/protected/private maken?
Als je die variabele alleen gebruikt in die functie d.m.v. een parameter hoef je geen instantie variabele te maken. Als jij de variabele op meerdere plekken binnen je object wilt gebruiken, dan moet je die wel aanmaken.
Misschien zou je toch beter een minder nutteloos voorbeeld geven.
Je mag uiteraard variabelen gebruiken binnen funties. Die variabelen zijn niet zichtbaar buiten die specifieke methode (functie).
Gewijzigd op 29/12/2010 16:24:05 door Mike Smit
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
30
31
32
33
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
30
31
32
33
<?php
class formulier {
public $type;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
return false;
}
else {
$this->type = $type;
return true;
}
}
public function valid($veld) {
if($this->type == 'post') {
if(isset($_POST[$veld])) {
return true;
}
else {
return false;
}
}
}
}
?>
class formulier {
public $type;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
return false;
}
else {
$this->type = $type;
return true;
}
}
public function valid($veld) {
if($this->type == 'post') {
if(isset($_POST[$veld])) {
return true;
}
else {
return false;
}
}
}
}
?>
En dan gaat het mij om de valid function en de var $veld. Moet ik die ook zo doen als $type of kan ik het gewoon zo laten.
Gewijzigd op 29/12/2010 17:07:13 door Wouter J
Zo laten.
Dus als je het alleen in die functie gebruikt mag het gewoon zo. En als je het bij een andere functie wilt gebruiken/aanpassen buiten de classe moet je het met public doen?
Maar ook als je binnen je klasse een variabele nodig hebt die in een andere functie staat (zelfde klasse), zal je iets met $this->... gebruiken.
Het gaat er om: moet die variabele bijgehouden worden buiten de functie?
Variabelen die je binnen de klasse nodig hebt, maar niet er buiten, kan je als 'private' of 'protected' zetten.
(maar nu ga ik er wat snel en onvolledig over)
@kris, bedankt. De verschillen tussen private, protected en public weet ik al. Maar van het overerven snap ik niet zo veel. Weet iemand daar misschien een goede tut over?
Wouter J op 29/12/2010 17:56:44:
... Maar van het overerven ...
Een voorbeeldje. Niet t veel syntax; meer gewoon om de gedachtegang uit te leggen.
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
30
31
32
33
34
35
36
37
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
30
31
32
33
34
35
36
37
<?php
$mijn_auto = new auto();
$mijn_ferrari = new sportwagen();
class auto {
public function __construct() {
// ...
}
public function geef_gas() {
// ...
}
public function open_deur() {
// ...
}
}
class sportwagen extends auto {
public function __construct() {
// ...
}
public function open_dak() {
// ...
}
}
class stationwagen extends auto {
public function __construct() {
// ...
}
public function open_laadklep() {
// ...
}
}
?>
$mijn_auto = new auto();
$mijn_ferrari = new sportwagen();
class auto {
public function __construct() {
// ...
}
public function geef_gas() {
// ...
}
public function open_deur() {
// ...
}
}
class sportwagen extends auto {
public function __construct() {
// ...
}
public function open_dak() {
// ...
}
}
class stationwagen extends auto {
public function __construct() {
// ...
}
public function open_laadklep() {
// ...
}
}
?>
Wat zie je?
Een sportwagen IS een auto, maar dan met een aantal dingen extra.
In de class auto definieer je alles wat gemeenschappelijk is aan de functionaliteit van de auto.
Een uitgebreide class biedt je de mogelijkheid om extra functionaliteit te voorzien.
Een stationwagen kan zijn dak niet openen. Een sportwagen wel.
Leuk is dus: alle functies van auto krijg je zomaar cadeau in de extended class.
Die functies hoef je dus niet meer opnieuw in je extended class te definiëren.
Essentieel:
Een sportwagen is een auto. Indien dit niet geldt, mag je niet extenden.
Bv.
class peer extends appel {
}
Dit mag je niet doen. Een appel is geen peer.
Wat wel mag, is zowel een appel als een peer een extend laten zijn van de class fruit.
Gewijzigd op 30/12/2010 06:41:49 door Kris Peeters
Wouter J op 29/12/2010 17:05:38:
Even een voorbeeldje in wat voor context ik hem wil gebruiken:
En dan gaat het mij om de valid function en de var $veld. Moet ik die ook zo doen als $type of kan ik het gewoon zo laten.
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
30
31
32
33
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
30
31
32
33
<?php
class formulier {
public $type;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
return false;
}
else {
$this->type = $type;
return true;
}
}
public function valid($veld) {
if($this->type == 'post') {
if(isset($_POST[$veld])) {
return true;
}
else {
return false;
}
}
}
}
?>
class formulier {
public $type;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
return false;
}
else {
$this->type = $type;
return true;
}
}
public function valid($veld) {
if($this->type == 'post') {
if(isset($_POST[$veld])) {
return true;
}
else {
return false;
}
}
}
}
?>
En dan gaat het mij om de valid function en de var $veld. Moet ik die ook zo doen als $type of kan ik het gewoon zo laten.
Wat stel je je voor bij de return waarde van de __construct() methode?
Een constructor hoort geen return terug te geven.
Een constructor is er om het object aan te maken.
OOP is in eerste instantie een mentale knop die je moet omdraaien.
Daarom geef ik graag voorbeelden die wat verwijderd zijn van de code waar ze mee bezig zijn en die niet echt veel zouden gebruikt worden in php.
Gewijzigd op 30/12/2010 06:48:30 door Kris Peeters
En die return had ik alleen hier op het forum staan. Ik heb zelf in de constructor een exit staan. Mag dit wel?
Indien je dit doet kan je van zeg maar overal aan die variabele.
Het is beter om deze private te maken en een getter voor deze variabele te maken, zo heb je meer controle over wat er precies gebeurd.
en een exit in je constructor? hoe bedoel je?
En dit bedoel ik met exit in de constructor:
als ik per ongeluk een papiertje in een spaarpot steek, ga ik het ook niet stukslaan, ik ga hem openmaken en t eruit halen.
Of gewoon werken met een nieuwe var:
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
<?php
class formulier {
private $type;
private $error;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
$this->error = 'Type: Je hebt een ongeldige type gebruikt.';
}
else {
$this->type = $type;
}
}
public function error() {
return $this->error;
}
}
?>
class formulier {
private $type;
private $error;
public function __construct($type) {
$mogelijk = array('post', 'get');
if(!in_array(strtolower($type), $mogelijk) {
$this->error = 'Type: Je hebt een ongeldige type gebruikt.';
}
else {
$this->type = $type;
}
}
public function error() {
return $this->error;
}
}
?>
doe gewoon een echo van de error...
Wouter J op 30/12/2010 11:27:51:
Maar je mag niet returnen in een constructor. Hoe moet ik dan een goede foutafhandeling maken?
Maak een extra method in je klasse die terug geeft of je object al dan niet correct is aangemaakt. Dus voer je je foutafhandeling in die functie. Dit geldt enkel voor je constructor eh. (Dit is een mogelijkheid eh)
Tikkes C:
doe gewoon een echo van de error...
In een functie mag je toch nooit echoen?
Jens V:
Maak een extra method in je klasse die terug geeft of je object al dan niet correct is aangemaakt. Dus voer je je foutafhandeling in die functie. Dit geldt enkel voor je constructor eh. (Dit is een mogelijkheid eh)
Dus zoals ik hem nu heb gemaakt?