Hoi,

Ik ben een beginner met OOP en heb de volgende code:

<?php

class InvalidLoginException extends Exception { };
class InvalidNewsMessageException extends Exception { };

class UserSessionController
{

protected $db;

function __construct(PDO $db)
{
$this->db = $db;
}

private function checkUsername($user)
{
if(strlen($user) < 3)
throw new InvalidLoginException('Gebruikersnaam te kort.');

return true;
}

private function checkPassword($pass)
{
if(strlen($pass) < 6)
throw new InvalidLoginException('Wachtwoord te kort.');

return true;
}

private function checkCombination($user,$pass)
{
$query = "SELECT geb_id, gebruikersnaam FROM gebruiker WHERE gebruikersnaam = :user AND wachtwoord = :pass";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', md5($pass));
$stmt->execute();

if($stmt->rowCount() != 1)
throw new InvalidLoginException('Combinatie gebruiker/wachtwoord onbekend');

return $this->fetch($stmt);

}

protected function fetch(PDOStatement $stmt)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);

return $data;
}

protected function fetchAll(PDOStatement $stmt)
{
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

return $data;
}

public function login($username,$password)
{
$this->checkUsername($username);
$this->checkPassword($password);

if($this->checkCombination($username,$password))
{
$user = $this->checkCombination($username,$password);
if($user)
{
$_SESSION['USER']['ID'] = $user['geb_id'];
$_SESSION['USER']['NAME'] = $user['gebruikersnaam'];
$_SESSION['LOGGEDIN'] = true;
}
}

return true;
}
}

class NewsController
{
protected $db;

function __construct(PDO $db)
{
$this->db = $db;
}

public function getNews()
{
$query = "SELECT n.nie_id, n.titel, n.datum FROM nieuws n ORDER BY n.datum ASC";
$stmt = $this->db->prepare($query);
$stmt->execute();

return $this->fetchAll($stmt);
}

public function getHomePageNews()
{
$query = "SELECT n.nie_id, n.titel, DATE_FORMAT(n.datum, '%d-%m-%Y') as datum FROM nieuws n ORDER BY n.datum ASC LIMIT 0,10";
$stmt = $this->db->prepare($query);
$stmt->execute();

return $this->fetchAll($stmt);
}

public function getNewsById($id)
{
$query = "SELECT n.nie_id, nc.ncat_id, n.titel, n.bericht, n.datum, nc.naam FROM nieuws n INNER JOIN nieuws_categorie nc ON (nc.ncat_id = n.ncat_id) WHERE n.nie_id = :id";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();

if($stmt->rowCount() != 1)
throw new InvalidNewsMessageException ('Nieuwsbericht niet gevonden');

return $this->fetch($stmt);
}

protected function fetch(PDOStatement $stmt)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);

return $data;
}

protected function fetchAll(PDOStatement $stmt)
{
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

return $data;
}
}

class OutbreakController
{

protected $db;

function __construct(PDO $db)
{
$this->db = $db;
}

public function getOutbreak()
{
$query = "SELECT n.nie_id, n.titel, n.datum FROM nieuws n ORDER BY n.datum ASC";
$stmt = $this->db->prepare($query);
$stmt->execute();

return $this->fetchAll($stmt);
}

protected function fetch(PDOStatement $stmt)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);

return $data;
}

protected function fetchAll(PDOStatement $stmt)
{
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

return $data;
}
}

/* General Functions */

function safeUrl($string, $koppelteken = '-') {
$string = strtolower($string);
$string = strip_tags($string);

$string = preg_replace("#\&([a-z]{1})([a-z]{1,})\;#", "\\1", htmlentities($string)); // zet alle rare tekens om naar gewone tekens (het idee dankzij Webmakerij)
$string = str_replace(" ", $koppelteken, $string); // zet spaties om in het koppelteken
$string = preg_replace("#[^\w".preg_quote($koppelteken, "#")."]#", "", $string); // haal alle tekens zoals quotes, komma's en punten uit de string, behalve het koppelteken
$string = trim($string, $koppelteken); // haal de koppeltekens aan de uiteinden van de string weg

return $string; // geef m maar terug :)
}
?>

Is dit een goed begin qua OOP?
Lijkt mij OK (behalve die login-functie van de usercontroller, die doet 2x checkCombination, wat gewoon maf is)

Combineer het nu eens met elkaar zodat je een werkende nieuwspagina krijgt? Pas wanneer je dat probeert merk je vaak de problemen met je ontwerp, want dan moet je dingen doen die je van tevoren niet had bedacht.
Ik heb een werkende nieuwspagina, zie linkje. Of bedoel je dat niet?

En ik zie het idd ook: dubbel checkCombination :) Veranderd ;)
Jep, dat bedoelde ik. Maar ik wed dat je daar nog een heleboel procedurele code (of geen code) in hebt zitten. Hoe zou je bijvoorbeeld het toevoegen van nieuws doen? (hint: het kan enorm simpel, en dat is naar mijn idee ook de beste manier)

Wat wil je zelf nu verder doen? Je kan enorm veel dieper gaan met OOP, proberen alles in objecten in te delen. Proberen de hele afhandeling van een request zo natuurlijk mogelijk te organiseren. Proberen ieder onderdeel zo modulair te maken dat je in principe een class zou kunnen maken die je nieuwsbericht naar een pdfje vertaalt zonder dat je de code voor de andere delen hoeft aan te passen (en natuurlijk dat de code voor het genereren van dat pdfje niet nog allemaal dingen naast het genereren van het pdfje doet) Maar voor iets simpels als een nieuwssysteem is dat vaak niet nodig, laat staan dat het praktisch is om dat helemaal in objecten uit te modelleren.

Het is misschien wel een leuke oefening :)

Maar als je liever iets ingewikkelders hebt, iets veel meer technisch, dan kan je eens wat bladeren door design patterns (op internet staan genoeg lijstjes) Meestal krijg je daar wel leuke ideeën van. Ook leuk is om eens te kijken naar PHP's hulpmiddeltjes voor OOP programmeurs. Bijvoorbeeld de ArrayAccess interface, of de IteratorAggregate interface.

Hmm, nu ik het woord Interface zit te typen, één ding wat je bij normaal OO programmeren heel veel doet zie ik jouw hier niet echt doen: het gebruiken van objecten in plaats van simpele typen. Bijvoorbeeld een datetime-object voor de datum/tijd-stamp van een bericht. Of een Article-object om het bericht zelf te bevatten. Pas als je dat veelvuldig gaat gebruiken kom je zelf achter de noodzaak als interfaces en de voordelen van overerving. (en een beetje abstracte classes)
De site wordt uiteindelijk niet echt super ingewikkeld. Wat ik dus nog moet is een admin panel maken waar je nieuws kan toevoegen (en later meer). Waar het mij deze post om gaat is of ik goed bezig ben met OOP.

Ik snap echter niet wat je met de laatste alinea bedoelt. En wat is jouw manier om simpel nieuws toe te voegen?
De simpelste manier is gewoon een method aan je News_Controller toe te voegen die het titel, de inhoud en de categorie als argumenten krijgt, de query uitvoert, en je het id teruggeeft.

Maar wat je ook vaak ziet is dat men eerst een Article-object opbouwt en controleert, en dat dan aan de News_Controller geeft. De News_Controller doet dan een insert-query en vult de id-property in het Article-object. De fetch-methods geven ook Article-objecten terug. Je werkt dan niet meer met simpele waarden en arrays om je nieuws te representeren, maar met een object dat een nieuwsitem is. Dat is wat netter, wat meer in de richting van OOP.

Reageren