Beste mensen (PHP/OO gurus!),

ik ben bezig met een klein CMS systeempje op mijn werk, wat we intern willen gaan gebruiken om kleine website-jes op een gemakkelijke manier te gaan uitrollen, Het systeem is nog in een baby-stadium, (al heb ik al wel een verbinding opgebouwd met de database en een aantal overzichten uitgebouwd op mijn webservertje),

en een van de vragen die nu rijst is wat is een goede benadering om gegevens op te halen en te objecten te vullen? ik zal een klein fictief voorbeeld geven:

(voorbeeld 1)
<?php
// de gebruiker heeft een website geselecteerd, hier heb het id-tje van
$oWebsite = new Website($id); // aanmaken website object. vandaar $o .
$aWebsite -> ophalen(); // ophalen geeft een array met de gegevens van de site( key / value etc)
// attributes/toestand van website object vullen:
$oWebsite -> setDomeinnaam($aWesite['domeinnaam']);
$oWebsite -> setItemZus($aWesite['itemzus']);
$oWebsite -> setItemZo($aWesite['itemzo']);
// etc..
?>

en als ik dan verderop in de code of in de html iets nodig heb doe ik dus
<?php
$oWebsite->getDomeinnaam()
$oWebsite->getItemZus()
// ...
?>


(voorbeeld 2)
ik zou de logica om het object te vullen in de class methods kunnen wegwerken:
<?php
$oWebsite -> new Website($id);
$oWebsite -> ophalen(); // hier handelt het object het vullen van zijn eigen attributes af zoals:

public function ophalen ($id) {

try {
select * where id = $id // even simpel gezegd

result -> stmt->execute();

$this -> attribuutjeZus = result[atribuutjeZus]
$this -> atribuutjeZo = result[attribuutjeZo]
}
catch (PDOException ex) {
// haaandle it etc
}
}
?>

De vraag is wat kan ik het beste doen? misschien idee-en?
bij voorbaat dank,

Stefan

Dan kun je het ook beperken tot een 3e variant. Kortweg:

$oWebsite -> new Website($id);

Intern laat je de constructor van de class Website() dan het object vullen met een private function fetchById($id) of iets dergelijks. Er is geen reden om een object "handmatig" te initialiseren door zelf steeds $oWebsite -> ophalen() aan te roepen.
ja klinkt inderdaad als een redelijke oplossing, want hierna kan ik gewoon alles met de getters ophalen,
en ik heb geen arrays meer nodig (die implementatie details bevatten over hoe de attributen in de database heten.. waarvan ik al aanvoelde dat het tegen de OO indruist)

tx :)
Ik zou voor geen van beide kiezen. Je Website object wordt het object dat data vasthoudt. Die moet dan ook nog niet eens zichzelf gaan aanmaken. Dan krijg je namelijke 2 verantwoordelijkheden en dat betekend dus 2 klassen. Dus je krijgt dan een WebsiteBuilder en een Website object:
<?php
$website = WebsiteBuilder::create()
->createWebsiteById($id);
?>
De WebsiteBuilder zorgt dan dat hij alle informatie ophaalt en die invoegt in Website. Website bestaat dan uit praktisch niks anders dan een verzameling getters/setters.
Dat is inderdaad een aardig idee om het te splitsen inderdaad (splitsing van verantwoordelijkheden / seperation of concerns inderdaad, ik ben wel beniewd waar ik methods als ophalen bijwerken verwijderen etc moet laten ?


<?php echo 'Thanks!'; ?>
<?php

class WebsiteBuilder
{
/** @var Database */
private static $db;

public static function setDb(Database $db)
{
$this->db = $db;
}

public static function create()
{
return new self(); // een nieuwe instance van zichzelf
}

public function createWebsiteById($id)
{
// merk op dat dit dummy code is, deze database heeft nog wat normalizatie nodig :)
$result = $this->db->getResult(
'SELECT title, slogan, theme FROM website_data WHERE id = ?',
array($id)
);

// maak een nieuw Website object met de informatie
$website = new Website($result['title'], $result['theme']);
$website->addParameter('slogan', $result['slogan']);

return $website;
}
}

class Website
{
private $title;
private $theme;
private $parameters = array();

public function __construct($title, $theme)
{
$this->title = $title;
$this->theme = $theme;
}

public function addParameter($name, $value)
{
$this->parameters[$name] = $value;
}
}
?>

Reageren