OOP gedachtengang
hier.
Nee, ik denk dat je Namespaces niet erg onder de knie hebt. Lees eens wat in over namespaces, zoals bijv. Ik heb nu dit:
User.php
UserMapper.php
index.php
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
use User\User;
use User\UserMapper;
// code
?>[/code
Ik snap er geen bal meer van nu.
use User\User;
use User\UserMapper;
// code
?>[/code
Ik snap er geen bal meer van nu.
Gewijzigd op 26/06/2012 20:35:59 door Roel -
Code (php)
Dan staat dit allemaal in 1 scope, de global scope. Dat is de \ namespace.
Meteen namespace deel je een stukje script op in een bepaalde categorie. Het is ong. te vergelijken als je heel veel berichten hebt:
- beginnen-met-HTML
- Objectief-leren-denken
- psychologie-voor-gevorderden
- Ruby-en-SQL
- CSS-icm-HTML
- ...
Als je deze berichten nu in verschillende categorieën opdeelt wordt het een stuk overzichtelijker:
HTML
- beginnen-met-HTML
- CSS-icm-HTML
Scripting
- Objectief-leren-denken
- Ruby-en-SQL
Overig
- psychologie-voor-gevorderden
- ...
Zo werken namespaces ook. Je deelt de klassen, functies en variabele op in verschillende categoriën. Alles van de User gaat in de User namespace en alles dat te maken heeft met berichte in de Post namespace.
Een namespace definieer je door 'namespace naam-v-d-namespace' te doen:
Als je nu in een bestandje deze klasse wilt gaan gebruiken zul je 2 dingen moeten doen: of je gaat in dezelfde namespace zitten als de klasse of je moet de namespace definiëren waarin de klasse zit:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
require_once 'Post/BlogPost.php';
$blogPost = new Post\BlogPost('Foobar title');
?>
require_once 'Post/BlogPost.php';
$blogPost = new Post\BlogPost('Foobar title');
?>
Hierin wordt de klasse BlogPost in de namespace Post gepakt.
De standaards wijzen voor dat het beter is om je namespace zo op te delen: ProjectName\Categorie\Categorie1\... Het wordt dan dus:
Nu wordt dit natuurlijk heel veel typwerk. Daarom hebben ze in PHP 'use' bedacht, daarmee kan je een alias maken voor een namespace:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
require_once 'Post/BlogPost.php';
use WjCms\Post as WjPost; // alias WjPost voor de namespace WjCms\Post
$blogPost = new WjPost\BlogPost();
?>
require_once 'Post/BlogPost.php';
use WjCms\Post as WjPost; // alias WjPost voor de namespace WjCms\Post
$blogPost = new WjPost\BlogPost();
?>
Begrijp je het nog?
Want nu heeft PHP het nog makkelijker voor je gemaakt! Je kan namelijk ook achter het use keyword de namespace + klassenaam plaatsen. Dan zal telkens die klassenaam worden gezocht in die namespace:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
require_once 'Post/BlogPost.php';
use WjCms\Post\BlogPost;
$blogPost = new BlogPost();
?>
require_once 'Post/BlogPost.php';
use WjCms\Post\BlogPost;
$blogPost = new BlogPost();
?>
Dit maakt het dus allemaal veel makkelijker voor je, maar is in feite niks anders dan die lange new WjCms\Post\BlogPost(); van een paar scriptjes geleden.
Nu hebben een paar genies bedacht dat je die namespaces natuurlijk ook mooi kan omzetten om te gaan autoloaden, dit heeft dus niet iets met elkaar te maken. Een autoload functie (of klasse) wordt aangeroepen als je een klasse instantiërt (met new ...()) en die klasse bestaat nog niet.
Dan zet een PSR-0 autoloader de namespace + klassenaam om in een filepath. Een PSR-0 autoloader zal WjCms\Post\BlogPost omzetten naar WjCms/Post/BlogPost.php.
Hierdoor zal je het bestand dus in de map WjCms/Post/BlogPost.php moeten verplaatsen.
Mijn functie fetchAll ziet er zo uit in mijn mapper:
Code (php)
Hoe zou deze eruit moeten zien met dat pattern als ik de rowClass toevoeg aan het dbTable object?