OOP Set Get etc

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Frank Nietbelangrijk

Frank Nietbelangrijk

01/11/2012 14:20:58
Quote Anchor link
ja er zijn goede tutorials zat. bijvoorbeeld op phptuts hebben ze een speciale oop tutorial. http://www.phptuts.nl/view/45/
 
PHP hulp

PHP hulp

23/12/2024 17:41:53
 
Bas D L

Bas D L

01/11/2012 14:22:35
Quote Anchor link
Dan duik ik daar maar eens in.
Bedankt voor je geduld!
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/11/2012 14:30:21
Quote Anchor link
Om het verschil uit te kunnen leggen tussen protected en private moeten we eerst iets gaan leren over Inheritance. Inheritance betekent gewoon erfenis.

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
28
29
30
31
32
33
34
35
<?php

class Person {
    protected $name;
    
    public function getName() {
        return $this->name;
    }

    
    public function setName($name) {
        $this->name = $name;
    }
};


class Woman extends Person {
    protected $sex;
    
    function
__construct() {
        $this->sex = 'Female';
    }

    
    public function getSex() {
        return $this->sex;
    }
    
};


$persoon = new Woman();
$persoon->setName('Sandra');

echo $persoon->getName();
echo "\n";
echo $persoon->getSex();

?>



Toevoeging op 01/11/2012 14:31:19:

Test en bestudeer dit nog maar eens. Succes!
 
Wouter J

Wouter J

01/11/2012 15:39:13
Quote Anchor link
- SanThe - op 01/11/2012 13:49:55:
Hoi Frank,

Nu je toch duidelijk aan het uitleggen bent. Kun je mischien heel in het kort de verschillen uitleggen tussen public, protected en private?

SanThe.

Nu ben ik niet Frank, maar een jaar geleden heb ik dit eens uitgebreid uitgelegd: http://www.phphulp.nl/php/forum/topic/oop-visibility/76673/#541920
 
Bas D L

Bas D L

01/11/2012 15:43:01
Quote Anchor link
Ik heb nu onderstaand gemaakt echter rekent de class niet laat gewoon 5*25 zien.
Hoe krijg je voor mekaar dat ie * output?

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
28
29
30
31
32
33
34
35
class Calc
{
    private $_input;
    private $_input2;
    private $_sign;
    private $_output;

    function setInput($int){
        $this->_input = (int) $int;
    }

    function setInput2($int){
        $this->_input2 = (int)$int;
    }

    function setSign($str){
        $this->_sign = $str;
    }
    
    function calculate(){
        $this->_output = $this->_input . $this->_sign . $this->_input2;
    }

    function getResult(){
        return $this->_output;
    }
}


$objCalculate = new Calc();
$objCalculate->setInput(5);
$objCalculate->setInput2(25);
$objCalculate->setSign('*');
$objCalculate->calculate();
echo $objCalculate->getResult();
 
Wouter J

Wouter J

01/11/2012 15:45:22
Quote Anchor link
Bas D L op 01/11/2012 14:18:32:
Dankjewel! Dan begrijp ik het, nu nog toepassen hahaha.
Zijn daar nog goede vb van of tuts?

Ik raad je aan nooit publieke properties te gebruiken. Je kan ze vanaf buiten manipuleren zonder dat je er in de klasse controle op hebt. Nu is dat rampzalig: In OO wil je zo flexibel mogelijk scripten. De klasse weet niks van de buitenkant, hoe hij gebruikt wordt wat er verder is, ect. De klasse weet alleen van zijn eigen binnenkant, het is de bedoeling dat je hem zoveel mogelijk controle geeft op zijn eigen binnenkant.

Als ik bijv. een naam van een gebruiker wil instellen dan wil ik zeker zijn dat daar geen vreemde tekens in zitten. Daarvoor gebruik ik een mooie setter:
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
<?php
class User
{
    private $name;

    public function setName($name)
    {

        if (!preg_match('|[a-zA-Z0-9]|', $name)) {
            // foutmelding (voorkeur voor exceptions
        } else {
            $this->name = $name;
        }
    }
}


$user = new User();
$user->setName('wouter'); // mag
$user->setName('wouter!%@'); // foutmelding
?>


Alleen als $name nu public was geweest heb ik deze hele controle niet meer!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$user
= new User();
$user->setName('wouter!%$'); // foutmelding
$user->name = 'wouter!$%'; // mag gewoon
?>
 
Bas D L

Bas D L

01/11/2012 15:50:55
Quote Anchor link
@Wouter, ook een goeie uitleg. Snap het!
 
Wouter J

Wouter J

01/11/2012 15:51:33
Quote Anchor link
@Bas, $this->sign is gewoon een string en dus ziet PHP gewoon een string '5 * 3' en niet de formule 5 * 3. Je kan dit op een erg OO manier doen en voor elke rekenactie een klasse maken die een interface implementeerd, alleen daar mag je denk ik over een paar weken naar kijken. Voor nu zou ik gewoon verschillende methods toevoegen en die aanroepen:
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
28
29
30
31
32
<?php
class Calculator
{
    public function sumAction(array $numbers)
    {

        return array_sum($numbers);
    }


    public function multiplyAction($numbers)
    {

        $result = 0;

        foreach ($numbers as $number) {
            $result *= $number;
        }


        return $result;
    }


    // ...

    public function calculate($action, array $numbers)
    {

        $method = $action.'Action';

        if (method_exists($this, $method)) {
            return $this->$method($numbers);
        }
else {
            // actie bestaat niet, geef foutmelding
        }
    }
}
 
Bas D L

Bas D L

01/11/2012 15:56:45
Quote Anchor link
Wouter J op 01/11/2012 15:51:33:
@Bas, $this->sign is gewoon een string en dus ziet PHP gewoon een string '5 * 3' en niet de formule 5 * 3. Je kan dit op een erg OO manier doen en voor elke rekenactie een klasse maken die een interface implementeerd, alleen daar mag je denk ik over een paar weken naar kijken. Voor nu zou ik gewoon verschillende methods toevoegen en die aanroepen:
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
28
29
30
31
32
33
34
35
<?php
class Calculator
{
    public function sumAction(array $numbers)
    {

        return array_sum($numbers);
    }


    public function multiplyAction($numbers)
    {

        $result = 0;

        foreach ($numbers as $number) {
            $result *= $number;
        }


        return $result;
    }


    // ...

    public function calculate($action, array $numbers)
    {

        $method = $action.'Action';

        if (method_exists($this, $method)) {
            return $this->$method($numbers);
        }
else {
            // actie bestaat niet, geef foutmelding
        }
    }
}
[
/quote]

Dit gaat me iets tever, hoe los ik het in mijn scriptje op? Dat probeer ik in eerste instantie te begrijpen...
 
Wouter J

Wouter J

01/11/2012 16:04:56
Quote Anchor link
Bas, dit is hoe je het moet oplossen. Ik denk dat je vooral de calculate method niet begrijpt, daarom wat uitleg:
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
28
29
30
31
32
33
34
<?php
public function calculate($action, array $numbers)
{

     // alle methods zijn opgebouwd als <handeling>Action
     // als we voor $action 'count' meegeven moeten we kijken
     // naar een 'countAction' method in deze klasse. Vandaar
     // dat we deze string even opslaan in een variabele

     $method = $action.'Action';

     // voordat we de method kunnen uitvoeren gaan we even kijken
     // of deze bestaat, anders krijgen we PHP errors
     // de method_exists functie bevat 2 parameters:
     //  - de klasse, in dit geval gebruiken we $this welke
     //    verwijst naar de huidige klasse
     //  - de method waarnaar we zoeken, deze hebben we net
     //    opgeslagen in de $method variabele

     if (method_exists($this, $method)) {
         // oke, de method bestaat we kunnen hem gaan aanroepen!

         // De $this->$method syntax is een leuke, de $this verwijst
         // weer naar de huidige klasse en $method is de method
         // die we net aanmaakte. als we 'count' hadden ingevuld
         // wordt de method 'countAction' en zullen we hier
         // $this->countAction() aanroepen

         // Deze method wil als parameter een array met de nummers
         // waarmee we rekenen. Deze geven we dus ook mee.
         // Als laatste geeft hij een berekening terug en die
         // geven we hier in de calculate method nog een keer terug

         return $this->$method($numbers);
     }
else {
         // De handeling bestaat niet, we geven een foutmelding
     }
}
 
- SanThe -

- SanThe -

01/11/2012 16:09:39
Quote Anchor link
Wouter J op 01/11/2012 15:39:13:
Nu ben ik niet Frank, maar een jaar geleden heb ik dit eens uitgebreid uitgelegd: http://www.phphulp.nl/php/forum/topic/oop-visibility/76673/#541920


Zeer duidelijke uitleg.
Bedankt.
 
Bas D L

Bas D L

01/11/2012 16:11:09
Quote Anchor link
@Wouter, sorry maar dit gaat me even te ver voor dit moment.
 
Wouter J

Wouter J

01/11/2012 16:17:40
Quote Anchor link
Wat gaat er dan te ver? Wat begrijp je niet? Als je iets niet begrijpt en vast houdt aan 'dat begrijp ik toch niet' zal je nooit verder komen, je moet proberen het wel te begrijpen en erachter te komen wat je niet kunt begrijpen. Dit is namelijk nog steeds erg basic.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/11/2012 16:20:13
Quote Anchor link
San The, OOP is voor jouw toch niet zo nieuw of wel?

@wouter: mooi voorbeeld. method_exist() heb ik zelf nog nooit gebruikt. Ik sla het op in de denktank

Frank
 
Bas D L

Bas D L

01/11/2012 16:32:54
Quote Anchor link
@Wouter, voor jou en vele, maar voor mij niet, ik ben net gaan begrijpen hoe get en set werkt...
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/11/2012 16:36:08
Quote Anchor link
ja bas ik denk dat je het daar ook gewoon even bij moet laten en morgen nog eens gaat kijken naar inheritance
Maar wouter zijn advies over nooit een public property die ga je wel onthouden toch?
 
Bas D L

Bas D L

01/11/2012 16:43:15
Quote Anchor link
@Frank, zeker, no public, just set, get, construct en private, protected!
Oja calculate($action, array $numbers) en method_exists($this, $method) ;-)
 

Pagina: « vorige 1 2



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.