[oop] functie constructor
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.
$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
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)
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
<?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.
}
?>
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 -
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?
Escapen hoeft toch niet bij een md5 codering?
Je zou hem kunnen gebruiken in een class die de sessie (en daarbij de current user) bijhoudt.
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,
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.
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)
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)