OOP start

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mebus  Hackintosh

Mebus Hackintosh

09/10/2012 17:44:24
Quote Anchor link
Ik wil al enkele jaren OOP leren en gebruiken voor het maken van websites maar vind het zelf altijd erg lastig om de juiste naamgeving te gebruiken. Ben nu momenteel bezig met een website waarbij er ingelogd moet kunnen worden als 'medewerker' en als 'klant' omdat een werkbon aangemaakt kan worden door een werknemer en de klant via internet kan kijken hoever de werkzaamheden zijn.

Ik heb nu het volgende:

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
36
37
38
<?php

class User
{
    private $_username;
    private $_firstname;
    private $_middlename;
    private $_lastname;
    private $_language;

    public function __construct($name = 'Bezoeker')
    {

        $this->_username = $name;
    }


    protected function setUsername($name)
    {

        $this->_username = $name;
    }


    public function getUsername()
    {

        return (isset($this->_username)) ? $this->_username : false;
    }


    protected function setLanguage($language)
    {

        $this->_language = $language;
    }


    public function getLanguage()
    {

        return (isset($this->_language)) ? $this->_language : false;
    }

}


?>


En wil dit graag gebruiken als basis (dit is nog niet uitgewerkt). Mijn vraag is echter waar ik de login functies maak? Maak ik hiervoor een aparte Login class of doe ik dat in deze class zodat de volgende class die ik wil maken 'employe' gebruik kan maken van de functionaliteit van de 'user' (parent) class?

Het mooie aan de tutorials die ik zie is dat alles goed wordt uitgelegd, maar niet meerdere voorbeelden worden gegeven over andere functies die een class kan hebben.

De volgende tutorials heb ik doorgenomen:

http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-1.php
http://www.phphulp.nl/php/tutorial/overig/oop-beginnershandleiding-php5/701/inleiding/1841/
http://phptuts.nl/view/45/1/
http://www.phphulp.nl/php/tutorial/classes/dependency-injection/760/inleiding/2027/

Als er nog meer aanraders zijn wil ik ze graag doorlezen!
Gewijzigd op 09/10/2012 17:45:33 door Mebus Hackintosh
 
PHP hulp

PHP hulp

11/08/2020 18:43:49
 
Jaron T

Jaron T

09/10/2012 18:49:42
Quote Anchor link
Ipv elke keer deze onzin uit te voeren kan je beter je properties een default value geven;

return (isset($this->_language)) ? $this->_language : false;

edit;
nu antwoord op je vraag, je hebt nu slechts een 'domain' class gemaakt. Nu moet je nog je models + controllers maken;

controller is de koppeling tussen je domain class en je model (model spreekt db class weer aan).

edit;

als je employee/customer etc wilt gaan gebruiken die erven van user moet je hem abstract maken (volgens mij kan dat in php) en dan doe je Employee extends User en kan je eventueel de parent/super aanroepen
Gewijzigd op 09/10/2012 18:53:35 door Jaron T
 
Mebus  Hackintosh

Mebus Hackintosh

09/10/2012 18:52:39
Quote Anchor link
Jaron T op 09/10/2012 18:49:42:
Ipv elke keer deze onzin uit te voeren kan je beter je properties een default value geven;

return (isset($this->_language)) ? $this->_language : false;

edit;
nu antwoord op je vraag, je hebt nu slechts een 'domain' class gemaakt. Nu moet je nog je models + controllers maken;

controller is de koppeling tussen je domain class en je model (model spreekt db class weer aan).


Zal dat stukje code veranderen, dankje.

Ik zal even googlen voor models en controllers!
 
Wouter J

Wouter J

09/10/2012 18:53:07
Quote Anchor link
OO gaat niet zozeer om de code, meer om het denken. Vandaar dat ik een echte OO denk tutorial heb geschreven, misschien handig om eens te lezen: http://wouterj.nl/serie/orienteer-je-in-objecten/

Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.

Ik denk dat je jezelf nu wel kunt antwoorden.
 
Mebus  Hackintosh

Mebus Hackintosh

09/10/2012 19:01:38
Quote Anchor link
Wouter J op 09/10/2012 18:53:07:
OO gaat niet zozeer om de code, meer om het denken. Vandaar dat ik een echte OO denk tutorial heb geschreven, misschien handig om eens te lezen: http://wouterj.nl/serie/orienteer-je-in-objecten/

Even antwoord op je vraag:
In OO heb je vele regeltjes, maar de grootste/belangrijkste is deze:
Elke klasse of method heeft maar 1 verantwoordelijkheid.
In andere woorden:
Zodra je het woordje 'en' oid gebruikt in een omschrijving van een klasse of method weet je zeker dat je het moet splitten in meerdere klassen of methoden.

Ik denk dat je jezelf nu wel kunt antwoorden.


Super! Dit is net wat ik nodig had.
 
Wim E

Wim E

09/10/2012 19:58:54
Quote Anchor link
Waarom maak je geen gebruik van de magic methodes? __construct, __set, __get, __destruct, __sleep etc.
Scheelt een hoop getjes en setjes...
 
Wouter J

Wouter J

09/10/2012 20:30:25
Quote Anchor link
Ik zou het zo houden, veel meer controle en flexibiliteit. Stel dat je eerst dit hebt:
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
<?php
class User
{
    private $name;
    private $email;

    // ...

    public function __set($key, $value)
    {

        $this->$key = $value;
    }


    public function __get($key)
    {

        return $key;
    }
}


$user = new User();
$user->name = 'Wouter@$%#&';
$user->email = 'wouter@email.com';
?>

Dan wil je controleren of je wel een geldig email adres hebt:
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
<?php
class User
{
    // ...

    public function __set($key, $value)
    {

        if ('email' == $key) {
            if (false === strpos('@', $value)) {
                throw new \InvalidArgumentException(sprintf('Een email adres moet 1 @ bevatten, "%s" is gegeven', $value));
            }
        }


        $this->$key = $value;
    }
}

?>

En nu wil je opeens dat de username alleen uit letters bestaat:
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
<?php
class User
{
    // ...

    public function __set($key, $value)
    {

        // ...
        } elseif ('name' == $key) {
            if (!preg_match('|^[A-Za-z ]*?$|', $key)) {
                throw new \InvalidArgumentException(sprintf('Een gebruikersnaam mag alleen letters of spaties bevatten, "%s" is gegeven', $value));
            }
        }


        $this->$key = $value;
    }
}

?>


Nou dan weet ik wel wat sneller is en beter is, het gebruik van verschillende setters. Want nu heeft de method al weer 2 verantwoordelijkheden gekregen en het zal waarschijnlijk nog langzamer zijn ook, want magic methods zijn altijd al langzamer + de extra onnodige if statements.
 
Jaron T

Jaron T

09/10/2012 20:36:03
Quote Anchor link
persoonlijk zal ik je aanraden om wel gebruik te maken van __construct maar niet van de __set en __get , maar voor de non-magic methode zoals hij in (alle?) andere (echte)OOP talen gebruikt wordt. Dus gewoon getName(){} setName(){} etc.
 
Wim E

Wim E

09/10/2012 21:52:19
Quote Anchor link
Wouter,

Een get en set zijn enkel voor het 1 op 1 doorzetten van data.
De logica welke van toepassing is op een property zou je kunnen inzetten doormiddel van idd een soort Set methode. Maar als je van de 8 properties er 1 wil controleren of er een e-mailadres in zit, kun je dat beter voor die ene een set methode maken en de rest via magic methodes uit laten voeren.
 
Wouter J

Wouter J

09/10/2012 22:23:12
Quote Anchor link
Wim, dan wordt je code heel erg inconsistent, iets wat je altijd moet vermijden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$user
= new User();
$user->name = 'wouter'; // alsof je een property zet
$user->setEmail('wouter@ema.il'); // met een functie
?>


En waarom doen we dat nou eigenlijk? Voor die 1 minuut meer typewerk?

In PHP5.5 krijgen we waarschijnlijk de set/get methode uit C#, dat zou heel erg handig zijn: http://nikic.github.com/2012/07/10/What-PHP-5-5-might-look-like.html#getters_and_setters
maar tot die tijd moeten we het maar gewoon behelpen met wat meer typewerk.

Merk overigens op dat ik tegen de get en set magic methods ben, er zijn vele hele handige magic methods.
 
Mebus  Hackintosh

Mebus Hackintosh

10/10/2012 12:21:22
Quote Anchor link
Bedankt voor alle informatie!

@Wouter J, ik kan niet wachten op meer tutorials van je!
 
Wouter J

Wouter J

10/10/2012 17:44:47
Quote Anchor link
Mebus, het kost mij behoorlijk veel tijd om zo'n tutorial te schrijven, mede doordat ik geen regel code wil gebruiken, en veel tijd heb ik momenteel niet echt. Misschien dat er over 2 weken een nieuwe tutorial komt in die serie.
 
Mebus  Hackintosh

Mebus Hackintosh

10/10/2012 18:43:16
Quote Anchor link
Wouter J op 10/10/2012 17:44:47:
Mebus, het kost mij behoorlijk veel tijd om zo'n tutorial te schrijven, mede doordat ik geen regel code wil gebruiken, en veel tijd heb ik momenteel niet echt. Misschien dat er over 2 weken een nieuwe tutorial komt in die serie.


Oke, ik kan ook wel even wachten natuurlijk :) Wou alleen zeggen dat je tutorials beter te begrijpen zijn dan vele anderen.
 



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.