Beste,

Ik heb al enkele tuts ivm OOP gevolgd maar het wil mij nog steeds niet lukken.
Ik heb al zitten zoeken en kijken naar oop scripts maar ik geraak er maar niet aan uit. Kan iemand mij misschien een klein scriptje tonen met OOP en zonder OOP dat net hetzelfde doet dan kan ik daar verder uit leren.

Alvast bedankt!

Mvg
Bumpje
Stuk beter.

class GASTENBOEK
- reacties ophalen
- reacties deleten waar het id == $id

Bingo.


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.)


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
@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?
@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?
@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.
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.


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.
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".
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.
<?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.

@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.
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?

Reageren