get by id

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

25/02/2014 23:20:22
Quote Anchor link
Ola, ik vraag me iets af. Als je iets aan de hand van een ID wilt ophalen uit de database, bijv. een user of een product, wat is dan de meest gebruikte manier:

Zo...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$id
= 10;
$user = new User($id);
?>

of zo...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$id
= 10;
$user = new User();
$user = $user->getById($id);
?>
 
PHP hulp

PHP hulp

29/12/2024 12:47:44
 
Bart V B

Bart V B

25/02/2014 23:35:43
Quote Anchor link
ik zou voor optie 2 gaan.
Stel je wil meer dingen setten of getten (hint) heb je meer mogelijkheden. ;)
 
Ozzie PHP

Ozzie PHP

25/02/2014 23:44:29
Quote Anchor link
Bart, thanks. Wat bedoel je met je hint? :)

Wat ik me in het verlgende ook afvraag... zou jij dan de gegevens van de persoon meegeven via de constructors of via methods?

Dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$user
= new User('Bart', 'V B', '1980-01-01', 'Amsterdam');
?>

of...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$user
= new User();
$user->setFirstName('Bart');
$user->setLastName('V B');
// enz.
?>
 
Wouter J

Wouter J

25/02/2014 23:50:37
Quote Anchor link
Geen van beide.

Ik zou allereerst een repository (datamapper) gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$userRepo
= new UserRepository($db);
$user = $userRepo->findOneById($id);
?>


En als ik dit niet zou doen dan zou ik Active Record gebruiken (factory):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$user
= User::findById($id);
?>


Waarom ik vind dat jouw beide opties verkeerd zijn:
- Je initialiseert je object al voordat het bestaat. Je object bestaat namelijk pas zodra je het uit de DB hebt gehaald.
- Een constructor maakt een object klaar voor gebruikt. Het bevat de minst mogelijke parameters, alleen parameters die het écht nodig heeft dus. Een $id is het laatste wat ik van een User in een constructor zou zetten, een naam zou bijv. meer voor de hand liggen om in een constructor te gebruiken.
- Het User object staat compleet los van het hele database verhaal. Dat is helemaal niet aan de User object om zich daar zorgen over te maken, dat moet een andere class doen.

En als laatst, nu willen we alle users die een leeftijd hebben groter dan 18, doe jij dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$user
= new User();
$users = $user->getAllWhereAge('> 18');
?>

Of?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$users
= new User('age > 18');
?>

Vind je dat ook niet een tikkeltje lelijk? :p

Toevoeging op 25/02/2014 23:53:52:

En nog iets, ik hou er altijd van om geen constructor te gebruiken, maar een factory method. Een persoon maak je niet, je doet er wat anders mee. Stel we praten over een bedrijf, dan huur je een persoon in.
Dus als antwoord op je verlengde vraag, ik zou doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$user
= User::hire('Oscar', new \DateTime('1978-10-23'));
?>
 
Ozzie PHP

Ozzie PHP

25/02/2014 23:56:25
Quote Anchor link
Wouter... zo ver was ik nog niet :-/
Ik snap dat jij allerlei manieren gebruikt die je in de loop der tijd hebt opgepikt. En dat geldt voor mij hetzelfde :) Ik heb dus situaties gezien waarin users of producten als volgt worden opgehaald: $user = new User(18) of $product = new product(543). Dus zo raar is het niet.

Ook lijkt het me niet raar als je een user eerst leeg aanmaakt om vervolgens de properties te setten.

Maar vergeet even het database-verhaal. Stel ik wil een aantal eigenschappen toevoegen aan een user object. Denk aan naam, leeftijd, adres... doe je dat dan via setters, of doe je dat via de constructor?
 
Wouter J

Wouter J

26/02/2014 00:06:14
Quote Anchor link
>> Dus zo raar is het niet.

Omdat Jip en Joost het doen is het niet raar? Ik heb genoeg sites gezien die tabellen gebruiken voor hun lay-out, dus zo raar is het niet als ik dat ook doe. Ik heb genoeg mensen OO zien gebruiken met alleen static functies, dus zo raar is het niet. Ik zie genoeg script zonder mysql_real_escape_string, dus zo raar is dat niet...

Nee, je moet bij jezelf gaan nadenken. Waarom gebruik ik deze methode? Wat als ik nu van database verander? Voldoet mijn code aan het SOLID principe? Jouw code faalt bijv. al bij de S van SOLID: Single Responsibility Principle. Jouw User object heeft nu meteen al 2 responsibilities: user vasthouden en omgaan met de database.

>> Denk aan naam, leeftijd, adres... doe je dat dan via setters, of doe je dat via de constructor?

Wil je het nou hebben over de database of over wat je in een constructor stopt en wat in een setter? Het maakt eigenlijk niet zo heel veel uit, beide onderwerpen heb je al in de treure door gediscussieerd in 1 van de 1000 OO topics van je...
 
Ozzie PHP

Ozzie PHP

26/02/2014 00:12:10
Quote Anchor link
Wil je wel of niet discussiëren Wouter?
 
Wouter J

Wouter J

26/02/2014 00:27:01
 
Ozzie PHP

Ozzie PHP

26/02/2014 00:29:18
Quote Anchor link
Ja leuk... never mind...
 



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.