Starten met OOP.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Jasper DS

Jasper DS

27/12/2010 20:40:06
Quote Anchor link
Bumpje
 
PHP hulp

PHP hulp

23/12/2024 01:07:15
 
Jelmer -

Jelmer -

28/12/2010 00:35:13
Quote Anchor link
Stuk beter.
Quote:
class GASTENBOEK
- reacties ophalen
- reacties deleten waar het id == $id

Bingo.

Quote:
class REACTIE
- id van reactie ophalen
- auteur van reactie ophalen
- inhoud van reactie ophalen

Niet helemaal. De Reactie bewaart, bevat, heeft een id, een auteur en een inhoud. Ophalen doet de gastenboek class, die haalt immers de reacties op (en deze drie dingen zijn eigenschappen van een reactie, onderdeel van die reactie.)

Quote:
ONTBREEKT
-naam auteur onthouden
- een reactie onthouden

Naam auteur zit in de reactie, of in het User-object waar de auteur van een reactie naar verwijst. Ligt eraan hoe diep je wilt gaan. Reacties worden opgehaald door Gastenboek, voor nu is het ook prima om ze daar maar mee op te slaan.

Implementeren is nu heel gemakkelijk. Nu zou ik moeten zeggen van probeer het maar eens.
Spoiler Alert
Gewijzigd op 28/12/2010 00:37:11 door Jelmer -
 
The Ultimate

The Ultimate

28/12/2010 09:54:00
Quote Anchor link
@Jelmer:
OOP vraagje. Stel dat je een login/register systeem hebt. Je hebt een class User. Kan een User zichzelf registreren? Ik bedoel: moet je een method 'register' opnemen in de User class?
 
Nicoow Unknown

Nicoow Unknown

28/12/2010 10:05:24
Quote Anchor link
@The Ultimate,
Dat is eigenlijk altijd al een vraag geweest, en iedereen z'n antwoord is anders.

Als jij een User als puur object gebruikt, dan kan hij inderdaad niet bij de database.
Want een User heeft ook geen database toegang in je Object, en je UserController heeft dat waarschijnlijk wel.

Wat je ook wel ziet is dat een User wel database toegang heeft, daarbij zie je ook vaak dingen als:
$user = new User(id);
$user->save();

En dan pakt hij automatisch de juiste user.
En slaat hij de user op.

Zelf doe ik het altijd met een UserController en een AuthentificationController (voor het in en uitloggen).
En dan krijg je dingen als:
$userController->save($user);
Ik maak me code vaak zo dat hij in de save functie gaat kijken of het een nieuwe user is, of een oude, en dan roep ik de bijbehorende private functie aan.

Om fouten op te vangen bij registraties werk ik altijd met een setVar(var), en die gooit exceptions op als er een foute input is.

Maar wat denk jij zelf dat het beste werkt, en wat zou jij het lekkerste vinden werken?
 
The Ultimate

The Ultimate

28/12/2010 10:13:30
Quote Anchor link
@Nicoow:
Ben zelf ook (net als PHP Jasper) bezig om OOP onder de knie te krijgen en toen kwam deze vraag boven drijven.

Om antwoord te geven op jouw vraag:
Als je dan toch OOP bezig bent, dan maar meteen goed. Dus: UserController. Al zou ik wel graag van jou horen wat je precies bedoelt met: "Ik maak me code vaak zo dat hij in de save functie gaat kijken of het een nieuwe user is, of een oude, en dan roep ik de bijbehorende private functie aan." Dat snap ik namelijk niet helemaal.

Het is natuurlijk wel lekker makkelijk om gewoon een save/register-methode op te nemen in de User class, maar strict genomen klopt het - naar mijn idee - natuurlijk niet.
 
Jelmer -

Jelmer -

28/12/2010 10:17:59
Quote Anchor link
Heel heel heel strict genomen zou je inloggen en gebruikers moeten scheiden. Je hebt gebruikers, en je hebt een set classen die inloggen mogelijk maken. Die classen regelen dan het opslaan van de combinatie gebruiker – wachtwoord, (of gebruiker + openid, daarom zijn ze losgetrokken van de User class, zodat je verschillende manieren van inloggen kan maken) en die classen regelen het onthouden van de identiteit van iemand na het inloggen.

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
User_Store
- create($nickname, $email)
- get($id)

User
- id()

// regelt het onthouden van iemands identiteit (in bijv. $_SESSION)
Authentication
- __construct(User_Store $users)
  // roept $method->login($arguments) aan, en onthoudt het user-id dat die teruggeeft
- login(AuthenticationMethod $method, array $arguments)
- isLoggedIn()
  // geeft $users->get($currentUserId) terug.
- currentUser()

PasswordIdentification extends AuthenticationMethod
  // koppelt een gebruiker aan een wachtwoord
- register(User $user, $password)
  // geeft user-id terug indien gelukt
- login(array $arguments)

OpenIDIdentification extends AuthentictionMethod
- register(User $user, $openid)
 // geeft user-id terug indien gelukt
- login(array $arguments)


Maar in veel gevallen is dat misschien wat teveel, en dan zou ik zeggen dat je User_Store::create een extra argument, $password, meegeeft, en een extra method, User_Store::login($username, $password) die dan net zo werkt als User_Store::get($id), en dat je zelf de sessies e.d. afhandelt in een simpele class.
 
The Ultimate

The Ultimate

28/12/2010 10:27:34
Quote Anchor link
Hey Jelmer,

Bedankt voor de reactie. Ik ben bezig met het maken van een user/login script. Ik zal het later vandaag eens plaatsen (als ik er ver genoeg mee kom) zodat je het eventueel van commentaar kunt voorzien?

Wat ik mij nu afvraag: Ik zie jou overal het volgende doen:
"register(User $user, $password)"
"__construct(User_Store $users)"
Je geeft aan de methods iets mee dat geen variabele is. Kun je mij uitleggen wat dat precies is en waarom je dit doet? Dus: "(User" en (User_Store".
Gewijzigd op 28/12/2010 10:27:58 door The Ultimate
 
Nicoow Unknown

Nicoow Unknown

28/12/2010 10:27:42
Quote Anchor link
Je denkt erg in het Model View Controller principe.
Wat op zich niet erg is, maar OO denken is op 1001 manieren mogelijk.

De manier van een save methode in een User object is in mijn optiek ook niet correct OO, maar ik heb me door ervaren rotten op het gebied laten vertellen dat dat het wel is, maar iedereen z'n eigen smaak.

Een user Id is bij mij altijd standaard null.
Als ik de user ophaal, dan zorg ik dat hij de id zet op het bijbehorende id.
Dan krijg ik na een registratie of update altijd de regel:
$userController->save($user);

mijn save methode is dan eigenlijk heel simpel.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
public function save($user) {
    if ($user->id === null) {
        $this->register($user);
    }
else {
        $this->update($user);
    }
}

?>


Dan hoef je dus niet meer na te denken over exacte afhandeling, als je hetzelfde doel wilt (iets vernieuwen of bijzetten in de db) bereiken, kan je ervoor kiezen om de keuze voor Insert of Update te laten bepalen door je Controller.
 
The Ultimate

The Ultimate

28/12/2010 10:35:30
Quote Anchor link
@Nicoow:
Als ik het goed begrijp dan registreer jij dus ook iedereen die per ongeluk een verkeerd e-mailadres ingeeft (bijv. 1 letter verkeerd)?

@Jelmer:
Zie mijn vorige reactie.
Gewijzigd op 28/12/2010 10:36:07 door The Ultimate
 
Nicoow Unknown

Nicoow Unknown

28/12/2010 10:39:34
Quote Anchor link
Tuurlijk registreer je iemand die een verkeerd e-mail adres ingeeft, tenzij het een ongeldig e-mail adres is, want daarvoor heb ik exceptions zitten in mijn User object.
Ik snap jou reactie niet helemaal, waarom zou je niet iemand willen registreren die een verkeerd mail adres invult, je weet toch nooit of het e-mail adres correct is?
 
The Ultimate

The Ultimate

28/12/2010 10:45:57
Quote Anchor link
Nicoow Unknown op 28/12/2010 10:39:34:
Tuurlijk registreer je iemand die een verkeerd e-mail adres ingeeft
Alleen als je 1 en hetzelfde formulier gebruikt voor login en register. Ik laat bestaande gebruikers niet inloggen op mijn registratie-formulier. Dan weet ik dus al of iemand zich wil registreren of inloggen en daarop reageer je door of de gebruiker te registreren of in te loggen. Dat hoeft mijn script niet uit te zoeken. Lijkt me wel zo duidelijk.

Kan zijn dat ik er helemaal naast zit hoor. Ben maar een amateur, dus hoor het graag als het anders is.
 
Nicoow Unknown

Nicoow Unknown

28/12/2010 10:55:51
Quote Anchor link
Ik doe alleen profiel updates en registraties in 1 methode, inloggen is weer een hele andere controller.
Wie laat nou iemand inloggen op een registratie formulier?
Bij mij is het gewoon luiheid dat ik save() gebruik, en die 1 keer implementeer.
En dat ik er niet voor kies iedere keer zelf moet gaan kijken of het een update is of een registratie.
Dit kan dan namelijk een stuk makkelijker zijn op het moment dat je classes gaat gebruiken om formulieren naar voren te toveren, maar dat komt nog wel een keer ;)
 
Jasper DS

Jasper DS

28/12/2010 12:11:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
private $db;
    
    public function __construct(Database $db)
    {

        $this->db = $db;
    }

?>


@ jelmer, moet er bij dit stuk bij $db niet de host/gebruikersnaam/wachtwoord/database?

edit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
public function create($author, $content)
    {

        return $this->db->insert('guestbook', array(
            'author' => trim($author),
            'content' => trim($content),
            'added_on' => new DateTime()
        ));
    }

?>

kan je i.d.p.v. new DateTime() niet gebruik maken van de mysql_functie NOW() of gaat dat niet met pdo
Gewijzigd op 28/12/2010 12:16:21 door Jasper DS
 
Jelmer -

Jelmer -

28/12/2010 17:27:03
Quote Anchor link
The Ultimate op 28/12/2010 10:27:34:
Wat ik mij nu afvraag: Ik zie jou overal het volgende doen:
"register(User $user, $password)"
"__construct(User_Store $users)"
Je geeft aan de methods iets mee dat geen variabele is. Kun je mij uitleggen wat dat precies is en waarom je dit doet? Dus: "(User" en (User_Store".

Ik geef aan van wat voor class $user een instantie moet zijn. Zo kan je bij register($user, $password) aan $user alleen maar een instantie van de class User meegeven.


PHP Jasper op 28/12/2010 12:11:50:
@ jelmer, moet er bij dit stuk bij $db niet de host/gebruikersnaam/wachtwoord/database?

$db is een instantie van Database, en Database is gemaakt met een instantie van PDO, en die instantie van PDO is gemaakt met m'n gebruikersnaam/wachtwoord/pad-naar-sqlite-database.


PHP Jasper op 28/12/2010 12:11:50:
kan je i.d.p.v. new DateTime() niet gebruik maken van de mysql_functie NOW() of gaat dat niet met pdo

Kan ook, maar in mijn voorbeeld met die Database class zou 'NOW()' die quote-stap niet overleven, en letterlijk als de tekst NOW() worden geïnterpreteerd. En aangezien ik graag DateTime objecten gebruik, leek dit me even een gemakkelijke oplossing. Meestal gebruik ik een Database class achtig ding dat ook gewoon rauwe SQL aankan, en dan zou je NOW() kunnen gebruiken.

Nicoow Unknown op 28/12/2010 10:27:42:
De manier van een save methode in een User object is in mijn optiek ook niet correct OO, maar ik heb me door ervaren rotten op het gebied laten vertellen dat dat het wel is, maar iedereen z'n eigen smaak.

Het is inderdaad smaak, maar ik probeer zelf altijd ervoor te zorgen dat als je een object hebt, dat het object ook compleet en correct, en meteen bruikbaar is. Altijd. Value semantics, data hiding oid. Daarom dus geen public properties (want dan kan de class niet de waarden in die variabelen controleren, en kan hij niet garanderen dat het klopt) en daarom ook geen lege new User() aan kunnen maken, want die User is geen echte user, want hij is incompleet. Niet altijd even praktisch, maar volgens mij wel correct. En als je aan het leren bent kan je het het best correct leren, en dan langzaam afglijden naar praktisch lijkt mij.
 
Jasper DS

Jasper DS

11/01/2011 19:02:02
Quote Anchor link
Oke, er is nog één probleem ik snap niet hoe ik kan communiceren met mijn database. Dus ik moet een pdo class gebruiken maar is het mogelijk dat ik bij elke functie zelf mijn query kan typen. Dus bijvoorbeeld dat ik bij mijn functie delete($id) de query maak DELETE FROM guestbook WHERE id='".$id."'
Gewijzigd op 11/01/2011 19:02:54 door Jasper DS
 
Jens V

Jens V

11/01/2011 19:15:30
Quote Anchor link
Ik heb hier in de week ook een topic gehad omdat het deel interactie database en klassen me niet heel duidelijk was. Neem dit maar eens door. Vooral een van die laatste posts van Kris Peeters.
 

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.