[oop] functie constructor

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jaron T

Jaron T

04/07/2010 15:02:06
Quote Anchor link
Hey phphulpers, Ik heb de volgende situatie:

Ik heb een login class met een constructor: $gebruikersnaam en $wachtwoord.

Die wordt aangeroepen door:
$login = new Login($gebruikersnaam, $wachtwoord);

Binnen login escape ik de gebruikersnaam en wachtwoord.. + md5($wachtwoord).


Nu is mijn vraag:

Wat is de beste manier op mijn class aan te roepen? Moet ik vooraf de waardes al 'escapen' + 'md5' coderen? of moet ik dit pas binnen mijn class doen?

Bedankt.
 
PHP hulp

PHP hulp

25/04/2024 18:24:42
 
Wesley Overdijk

wesley Overdijk

04/07/2010 15:04:59
Quote Anchor link
Ik zou het anders aanpakken. Ik zou van je gebruikersnaam en wachtwoord een apart object maken.

$username = new class_username($user);
$password = new class_password($password);
$password->md5(); //Of een salt, sha1, whatever jij wilt.
$login = new login($username, $pasword);

EDIT:
Waarom ik dat zou doen, is omdat je dan meer controlle hebt over je element. Je kan de logica van dat element in je class stoppen, of een abstracte class maken voor al je elementen.
Gewijzigd op 04/07/2010 15:06:10 door wesley Overdijk
 
Jelmer -

Jelmer -

04/07/2010 17:09:51
Quote Anchor link
Login representeert je login-procedure? Dan vind ik dat md5-hash maken van je wachtwoord gewoon een onderdeel is van je login-procedure, en dus binnen die class moet gebeuren.

Mooier zou misschien zijn om een algemeen idee van een "login procedure" vast te leggen in een interface, en deze class die te laten implementeren. Zo kan je ook andere manieren van inloggen erbij schrijven. (bijvoorbeeld ingelogd blijven via een cookie -> aparte login-procedure waarbij de waarde in je cookie wordt gebruikt om een user-id terug te vinden)

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
<?php
interface AuthenticationProcedure
{
    public function authenticate(); // returns user-id
}

class Login implements AuthenticationProcedure
{
    public function __construct($username, $password)
    {

        $this->username = $username;
        $this->password = $password;
    }


    public function authenticate()
    {

        // md5(password)
        // query for user-id

        return $result['user-id'];
    }
}


class RemberMeCookie implements AuthenticationProcedure
{
    public function set_cookie($user_id);

    public function authenticate(); // probeert cookie uit te lezen, etc.
}
?>
Gewijzigd op 04/07/2010 17:10:15 door Jelmer -
 
Jaron T

Jaron T

05/07/2010 10:59:30
Quote Anchor link
Bedankt voor de reacties, ik heb eerlijk gezegd nog nooit met een 'interface' gewerkt. Hoe roep ik nu bijvoorbeeld de 'RemberMeCookie' functie aan die in de interface 'AuthenticationProcedure' zit?
 
Crude Oil

Crude Oil

05/07/2010 11:06:51
Quote Anchor link
Escapen hoeft toch niet bij een md5 codering?
 
Jelmer -

Jelmer -

05/07/2010 11:44:11
Quote Anchor link
Die interface is puur om vast te stellen dat objecten die instanties zijn van classes die die interface implementeren, in ieder geval een method authenticate hebben. Oftewel: als je vereist dat $taart instanceof AuthenticationProcedure, dan weet je zeker dat $taart->authenticate() aangeroepen kan worden. Een interface is niet vereist om het te laten werken, maar het is wel netjes.

Je zou hem kunnen gebruiken in een class die de sessie (en daarbij de current user) bijhoudt.
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
<?php
class Session
{
    public function login(AuthenticationProcedure $procedure)
    {

        $this->user_id = $procedure->authenticate();
    }
}

$login = new PasswordLogin($username, $password);

$session = Session::getInstance();

$session->login($login);
?>
 
Johan Dam

Johan Dam

05/07/2010 13:33:11
Quote Anchor link
Een interface is handig als je nog niet precies weet wat de inhoud van je classe word, als je je classe eenmaal gemaakt heeft, verliest het zijn waarde echter, gezien een interface alleen restricties oplegt aan de classe die het gebruikt.

Persoonlijk vind ik het zonde van de tijd om een interface te gebruiken,

Aparte classes maken van elementen is ook een beetje over-kill en druist ook wel in tegen het idee van OOP

hier is hoe ik het zou doen,
inloggen is iets wat een gebruiker kan doen, daarom zou login() een methode onder de classe gebruiker zijn,
een klein voorbeeldje,

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(!empty($_POST['username']) && !empty($_POST['password'])){
    $username = eventuele_functie_tegen_xss($_POST['username']);
    $password = md5($_POST['password']);
    $gebruiker->login($username, $password);
}

?>
 
Ivo K

Ivo K

05/07/2010 13:43:46
Quote Anchor link
Maar Johan, het controleren en coderen van de userinput, is dat geen onderdeel van het inloggen? Dat lijkt mij tenminste. Zo ja, dan is er een aparte klasse nodig, zou ik zeggen, die dat afhandelt, zoals Jelmer het doet. Of wil je in je functie login die klasse aanroepen, wat mij overigens niet heel raar lijkt.
 
Jelmer -

Jelmer -

05/07/2010 13:47:32
Quote Anchor link
Een gebruiker kan ook een topic bekijken, een gebruiker kan ook een berichtje in het gastenboek lezen, achterlaten, verwijderen... Moet ik daarom al mijn code voor het lezen van een topic en het plaatsen van een berichtje in het gastenboek maar in m'n gebruiker class zetten?

Ik vind het veel handiger om te kijken wat een gebruiker allemaal aangedaan kan worden. Met methods zou je alleen de state van een object, en alleen dat object mogen veranderen. Dat is een van de principes van OOP: encapsulation. De class draagt de volledige verantwoordelijkheid en enkel de verantwoordelijkheid voor zichzelf.

In jouw voorbeeld heeft een interface inderdaad geen zin. In mijn voorbeeld is hij daarentegen heel nuttig. Het is dat PHP een dynamische taal is, maar stel dat het C++ zou zijn geweest, dan was het ook nog eens vereist. Want alleen dankzij die interface weet je zeker dat er een method authenticate bestaat. (Bij C++ zou dat tijdens compile time worden gecontroleerd, bij PHP tijdens runtime, dus bij PHP zou je alsnog wanneer je website al live is pas kunnen merken dat het fout gaat. Maar dat maakt het niet een overbodige controle)
 
Johan Dam

Johan Dam

05/07/2010 14:00:25
Quote Anchor link
ja, de validatie hoort eigenlijk in de login() functie, dat klopt, daar is echter helemaal geen andere classe voor nodig.

in een gastenboek posten / lezen / verwijderen is een mogelijkheid van het gastenboek,
een topic bekijken is een mogelijkheid van de topic.

Als je je hele website 100% OOP wilt hebben, dan horen dat soort functionaliteiten inderdaad in dat soort classes. (goed, wie wil nou een website 100% in OOP?)

Persoonlijk vind ik het overbodig om (in PHP) met een interface te werken, ja, je weet zeker dat een classe de juiste methodes heeft (of beter, je komt erachter wanneer dit niet het geval is) maar ik heb nog niet in een situatie gezeten waar ik een methode vergeten ben.

Mocht je toch zo'n controle willen, dan kan je beter een abstracte classe overerven, zelfde voordeel (behalve dat je meerdere interfaces kan aanroepen en maar 1 classe kan overerven) + het voordeel dat je daar nog echte code in kwijt kan (als ik het me goed herinner)
 



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.