Hey,

Ik ben een student Toegepaste Informatica aan de Hogeschool te Gent en zit met een probleem wat betreft programmeren in de OOP manier.

Ik heb nu al reeds een jaar en half ervaring met wat Java en heb ook al ervaring met PHP procedureel - namelijk wat kleine websites gemaakt met eigen gemaakt nieuwsscript, gastenboek etc...).

Mijn probleem is dat ik heel graag in OOP zou willen blijven programmeren maar om de een of andere reden dringt dit systeem blijkbaar niet helemaal tot me door... :(

Ik lees en lees boeken over het onderwerp maar als het punt er dan aankomt dat ik zelf bijvoorbeeld een simpel nieuwsscript wil maken in OOP PHP dan lukt dit me langs geen kanten. (hetzelfde heb ik met Java ook).

Ik weet niet of iemand hier dit probleem ook had vroeger en of iemand weet hoe ik dit kan oplossen want het is een probleem dat me echt wel tegenhoud om verder te gaan.

MIjn uiteindelijke doel voorlopig in PHP zou een eigen framework schrijven zijn + mijn eigen CMS systeem schrijven die dit framework dan zou gebruiken met het MVC design pattern.
Maar dit lukt uiteraard niet als ik nog niet eens een eigen nieuwssysteem op een object georiënteerde manier kan maken :(

Kan iemand mij hierbij helpen?

Met vriendelijke groet,
Coldhearth
Dat nieuwsscript middels OOP, (middels klinkt leuker, als je bedenkt dat OOP een techniek, een truucje van de programmeur is en niet een taal zoals "in" zou doen vermoeden) hoever ben je daarmee gekomen?

Ik denk dat het helpt wanneer je de opbouw die jij had hier zou kunnen posten, zodat wij daarop commentaar kunnen leveren. Op die manier kunnen we een beetje zien hoe jij op dit moment object georiënteerd denkt, en kunnen we je bijsturen door vertellen hoe wij de onderdelen zouden aanpakken, en waarom die manier beter is dan dat wat jij al had :)

Object georiënteerd denken is even een kwartje dat moet vallen. Wanneer je dat eenmaal door hebt, en de theorie erachter ziet, is de stap naar een eigen framework in mijn beleving niet zo heel groot meer. Als je de basis snapt, kan je ook beredeneren waarom bepaalde design patterns design patterns zijn. Het volgende probleem wat je dan moet leren te voorkomen is over-engineering ;)
Ja idd een vriend van me die op school bijna afgestudeerd is en C++ programmeert zei me enkele maanden terug ook dat het een kwartje is dat moet vallen... probleem is dat ondanks mijn vele lezen en denken het kwartje niet valt.

Om de een of andere reden kan ik niet in OOP denken :( wat me wel erg frustreerd...

Ik zal hier straks dan ook eens een klein voorbeelde tonen van wat ik al heb (maar verwacht niet teveel hé)
Ik heb hier eens wat in elkaar gestoken omdat je het vroeg (het nieuwsscript heb ik niet meer staan)
Wat ik hier nu heb is een heeeel eenvoudig begin voor iets dat zou bedoeld zijn als een gastenboekje op een website.

Mijn structuur is als volgt:
model
model/form.php
model/Post.php
view
index.php

index.php
(deze bevat het gastenboek zelf)
<?php

require("../model/Post.php");

if(!isset($_POST['submit'])){
//als het formulier nog niet ingevuld is -> toon het formulier
include("../model/form.php");
}else{
$titel = $_POST['titel'];
$content = $_POST['content'];

//nieuw Post object maken dat een
//post voorsteld in het gastenboek
$post = new Post();
//een post toevoegen aan het gastenboek
$post->addPost($titel, $content);

}
?>


form.php
(deze bevat het html formulier om een post toe te voegen)

<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post">
	Titel:<br /><input type="text" name="titel" /><br />
	Content:<br /><textarea cols="20" rows="6" name="content"></textarea><br />
	<input type="submit" name="submit" value="OK" />
</form>


Post.php
(deze bevat het OOP gedeelte de klasse Post die een post in het gastenboek moet voorstellen)

<?php
class Post{
	private $titel;
	private $content;
	
	public function __construct(){}
	
	public function addPost($titel, $content){
		echo $titel . " - " . $content;
	}
	
	public function getTitel(){
		return $this->titel;
	}
	
	public function getContent(){
		return $this->content;
	}
}
?>


Bumpen:

Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.
Begrijp ik het goed dat Form & Post allebei een model zijn volgens jouw? Aangezien ze in de map 'models' staan..

Op zich is het opslaan en terughalen van berichten ook de taak van je model***, maar minstens zo belangrijk is dat de model beschrijft hoe de data eruit ziet, en hoe er mee omgesprongen moet worden. Je model moet beschrijven hoe een post eruitziet, welke eigenschappen een post heeft. Je model bevat een bouwplaat van een post: een klasse die een post beschrijft :)

<?php

class Post {

protected $_title;

protected $_content;

public function __construct($title, $content) {
$this->_title = $title;
$this->_content = $content;
}

public function title() {
return $this->_title;
}

public function content() {
return $this->_content;
}

}

?>

Iedere post in je gastenboek wordt gerepresenteerd door een instantie van de bovenstaande klasse. De instantie bevat de gegevens van de post. Dat deel had je dus op zich al goed :)

Echter, de Post-klasse beschrijft alleen hoe een Post eruit ziet, niet waar hij vandaan komt en hoe hij wordt opgeslagen. Laten we daar ook weer een onderdeel van je model voor maken. In het echt zou deze bijvoorbeeld naar een webservice, bestand of database schrijven, maar laten we het even simpel houden:

<?php
class Post_Store {

public function find_all() {
$posts = array();

foreach($_SESSION['posts'] as $post_data) {
$posts[] = new Post($post_data[0], $post_data[1]);
}

return $posts;
}

public function insert(Post $post) {
$_SESSION['posts'][] = array($post->title(), $post->content());
}

}
?>

De opslag van al je posts, een instantie van Post_Store, heeft twee methods vandaag: Eentje om alle posts weer terug te halen, en eentje om er een op te slaan. Zoals je ziet geef ik hem voor het opslaan niet de titel en de content, maar werkelijk een post. En ook bij het ophalen geeft hij niet data terug, maar Post-objecten, oftewel posts :) Object georiënteerd immers, we denken hier in objecten, en niet meer in data in arrays. Okee, de objecten zitten in een array, maar hoe wou je anders een lijstje teruggeven. Belangrijk is hier dat het niet de array is die beschrijft welke eigenschappen een post heeft, maar de Post klasse.

Op zich loop je bij deze setup redelijk snel tegen beperkingen op, je wil soms wat rouwere data opslaan in de database dan de data die de "getters" van het Post-object teruggeven. Op zich niet zo'n probleem, dan maak je er een method bij die de interne rauwe data teruggeeft van een Post instantie. Je moet jezelf er dan op behoeden alleen die method in de Post_Store klasse te gebruiken, en nergens anders, want anders is het idee dat de klasse Post je post beschrijft niet meer waterdicht.

Waarom wil je dat je klasse Post je post-gegevens bevat en niet gewoon een multidimensionale array die je terugkrijgt uit een mysql_fetch_assoc aantal keer aanroepen? Omdat de rest van je applicatie, op je Post en Post_Store klasse na, zich nu niet meer druk hoeven te maken over hoe de data wordt opgeslagen en bewaard. Ik kan helaas niet op een goed praktisch voorbeeld komen waarom je niet een array in plaats van een object zou willen gebruiken (alles kan je in theorie ook wel oplossen in de Post_Store klasse, of met wat extra SQL code) maar het voordeel van al je gastenboek-queries op één centrale plek, Post_Store, lijkt mij redelijk simpel: Je hoeft je query maar op één plek aan te passen wanneer je je database verandert.


Nu even naar je form. Dit is geen model, het representeert immers geen data (het presenteert ze wel :P, wat het deel van je view maakt als je MVC wilt aanhouden)

Nu nog even een compleet voorbeeldje van hoe je je posts als objecten kan beschouwen. Zeg maar MVC, maar dan zonder V en C :)
<?php

error_reporting(E_ALL);

ini_set('display_errors', true);

class Post {

protected $_title;

protected $_content;

public function __construct($title = '', $content = '') {
$this->_title = $title;
$this->_content = $content;
}

public function set_title($title) {
$this->_title = $title;
}

public function title() {
return $this->_title;
}

public function set_content($content) {
$this->_content = $content;
}

public function content() {
return $this->_content;
}

public function is_valid() {

/* Eisen:
* - de titel mag niet leeg zijn
* - de inhoud moet meer dan 3 tekens lang zijn
*/

return strlen($this->_title) > 0 && strlen($this->_content) > 3;
}

}

class Post_Store {

public function __construct() {

// zorg ervoor dat $_SESSION beschikbaar is
@session_start();

if(!isset($_SESSION['posts'])) {
$_SESSION['posts'] = array();
}
}

public function find_all() {
$posts = array();

foreach($_SESSION['posts'] as $post_data) {
$posts[] = new Post($post_data[0], $post_data[1]);
}

return $posts;
}

public function insert(Post $post) {

// klopt de post? We willen geen foute posts in de opslag
if(!$post->is_valid()) {
throw new Exception('Het bericht is incompleet');
}

$_SESSION['posts'][] = array($post->title(), $post->content());
}

}

$action = isset($_GET['action']) ? $_GET['action'] : 'list';

$posts = new Post_Store();

if($action == 'add') {

$new_post = new Post();

if($_SERVER['REQUEST_METHOD'] == 'POST') {

$new_post->set_title($_POST['title']);
$new_post->set_content($_POST['content']);

// voldoet de post?
if($new_post->is_valid()) {
$posts->insert($new_post); // invoegen
header('Location: 58732.php?action=list'); // toon alle berichten weer
} else {
echo 'Je bericht voldoet nog niet helemaal.';
}
}

echo '<form method="post" action="">';
echo 'Titel: <input type="text" name="title" value="' . htmlentities($new_post->title()) . '"><br>';
echo 'Inhoud: <input type="text" name="content" value="' . htmlentities($new_post->content()) . '"><br>';
echo '<button type="submit">Submit</button>';
echo '</form>';

} elseif($action == 'list') {

echo '<a href="58732.php?action=add">Bericht toevoegen</a>';
echo '<ul>';

foreach($posts->find_all() as $post) {
echo '<li>';
echo '<strong>' . htmlentities($post->title()) . '</strong>';
echo htmlentities($post->content());
echo '</li>';
}

echo '</ul>';
} else {
echo '400 Onbekende actie';
}
?>


*** Al je business-logic kan het beste eigenlijk in je model-deel van de applicatie, op zo'n manier dat je je models, en dus je business-logic overal met dezelfde klassen kan implementeren. Op die manier kan je dezelfde bestanden hergebruiken voor je website, je admin-paneel, je interne administratie, en je cron-jobs, etc. Door één centraal setje models te hebben heb je geen verschil in business-logic over de verschillende onderdelen van je onderdelen. Gevolg is wel dat je je models niet afhankelijk kan maken van een framework dat niet op alle plekken waar je de models gaat gebruiken beschikbaar is.
Oke dankje voor je post. Je weet duidelijk over wat je bezig bent :p
Ik versta nog niet alle delen na 1 keer overlezen te hebben wat je net geplaatst hebt hier maar dat komt wel.

Even een vraagje ... zou je het zien zitten om eventueel mij wat bij te staan of samen applicatis te schrijven zodat ik kan bijleren door iemand...? het lijkt me een goede manier om te leren als je samen kan werken met iemand die ervaring heeft en weet over wat hij praat. :)

Als je het samen kan doen is dat zeker een hulpje ;)
Maar kan je niet die vriend die bijna afgestudeerd is vragen je te helpen...
als je irl een uitleg krijgt is dat toch wat makkelijker denk ik en gaat een stuk sneller.. ^^

[offtopic]
hee hee tis geen dubbeltje maar een briefje van vijf wat naar beneden fladdert xD
[/offtopic]
Eum ja neen want die jongen programmeert enkel in C++ en dus niet Java of PHP (de talen waarin ik momenteel me in verdiep)
Zeker voor websites gaat dit niet ... aangezien hij niets kent van webdesign laat staan PHP ;)

Zou iemand het hier zien zitten me hierbij te helpen? :)
Ik zou dit een heel leuke ervaring vinden.
Omdat ik zie dat Jelmer maar een jaar ouder is dan mij en hij zoveeel verder zit...
Eerlijk gezegd is dit een beetje een slag in men gezicht :) ik wil dat ook kunnen !! :)

Dus als iemand dit hier ziet zitten... :) zou zeer fijn zijn :)
Als er 1 boek is dat ik je kan aanraden om 'design patterns' (waaronder mvc.. wat ik meer een architectuur vindt) in de smiezen te krijgen dan is dat:

Headfirst Design Patterns van uitgeverij O'reilly.

Alhoewel ik geen backend-koning ben (achtergrond grafische/web vormgeving) is het kwartje gevallen... Nu nog veel doen.

Object georienteerd programmeren hangt (wel) samen met de taal waarmee je 'bouw-werken' maakt. Naast de taal specifieke implementatie is OOP toch vooral een concept.. een abstract iets, een benadering die de programmertaal ansich overstijgt. Dat abstracte.. maakt het naar mijn mening pittig het 123 te vatten.
Ik zelf bak ook nog niet zo veel van het hele OO, maar probeer wel zoveel mogelijk te maken. Het kwartje moet nog vallen :).

Maar ik heb nog nooit een boek gelezen over PHP, en het gaat allemaal wel prima. Ik leer veel meer door op het forum aanwezig te zijn. Niet alleen zelf een topic starten. Maar een probleem van iemand anders oplossen. Als ik het zelf niet snap zoek ik namelijk even op php.net of hier tussen de tutorials etc.

Ook het OO verhaal heb ik hier 'geleerd' (nog steeds aan het leren). Er staan mooie tutorials tussen. Ook al vind ik dat de helft niet nodig is.

Dus mijn ervaring is dat de praktijk de beste manier is om te leren i.p.v. het te lezen uit een boek. Maar ik heb ook al heel veel andere reacties gelezen van mensen die het uit een boek leren fijn vinden.
Ik denk dat ik Design patterns van Head First eens ga lezen.
Ik hoop echt dat men kwartje binnenkort valt want ik vind het programmeren in OO op zich wel leuk enkel wordt ik sterk tegen gehouden omdat het "kwartje" niet valt :(

Reageren