Sjoerd schreef op maandag 07 januari 2008 @ 20:38:
@Face__Less eigenlijk hetzelfde als de function __autoload($class_name) ? of toch iets anders?
Ik ben begonnen praktisch een opzetje te maken in PHP maar het blijkt toch lastiger dan in vb.net
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| [b]index.php[/b]
include includes/config.php
include includes/autoload.inc.php
$user=new users();
echo $user;
[b]users.class.php[/b]
public id
public name
public email
public ...
function __construct(){
$data=new userData();
$this->name=$data->getUserName();
}
[b]userData.class.php[/b]
public function getUserName(){
sql query ("select name from users")
} |
Klopt dit schematische ontwerpidee ongeveer?
Op een paar punten na wel ongeveer. Maar die paar punten he...
In je index maak je een nieuwe klasse genaamd 'users' aan, echter, de naamgeving daarvan geeft al aan dat het gaat om een verzameling (of
collection van users. Verzameling-klassen worden eigenlijk nooit specifiek voor een bepaald type data gebruikt (users, zoals in jouw voorbeeld). In de plaats daarvan kun je beter gewoon arrays gebruiken (op een laag niveau), of een collection class (een class List, bijvoorbeeld), die arrays gebruiken om de data op te slaan maar extra functionaliteit toevoegen aan zo'n lijst, zoals zoekfuncties, sorteren, dat soort grappen.
In je tweede class, de User class, begint het goed - je hebt velden (of variabelen) waar je de gegevens met betrekking tot een user opslaat, maar het gaat (ontwerptechnisch gezien) mis bij de constructor. Voor zover ik kan zien laat je de User class
zichzelf vullen met gegevens (uit een db, bijvoorbeeld), wat eigenlijk iets is wat je niet wilt hebben, aangezien je een data-klasse een tweede rol als data access object geeft.
Een betere structuur in dat gebied zou als volgt zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class User {
private $id;
private $fiets;
private $name;
public __construct($id, $fiets, $name) {
$this->id = $id;
$this->fiets = $fiets;
$this->name = $name;
}
public setId($id) {
$this->id = $id;
}
public getId() {
return $this->id;
}
// nog meer van die getters / setters voor elke data.
} |
(Noot: De velden in een object zijn niet direct aanspreekbaar van buitenuit. Door deze structuur (wat vaak voorkomt in Java programmatuur) te gebruiken, kun je bijvoorbeeld validatie uitvoeren (evt met gebruik van exceptions). Maar het is vooral handig wanneer je nog een bewerking wilt uitvoeren op je gegevens wanneer ze toegevoegd of ingelezen worden uit je User object, zo hoef je alleen maar binnenin je User klasse wat te veranderen, niet in alle aanroepen)
(Noot 2: Ik heb (in vergelijking met Java) maar bar weinig ervaring met proper OO PHP)
En vervolgens een UserDao (User Data Access Object):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| class UserDao {
private $db; // database / data object
// (normaalgesproken zou je een verwijzing naar een databaseobject waarschijnlijk in een centrale ' dao'-klasse stoppen, die elke DAO extendt. Of gebruik maken van een database factory)
public __construct($db) {
$this->db = $db;
}
public get($id) {
$userdata = $db->get("from user where id="+$id"); // voorbeeld, gebruik je fantasie bij zoiets.
$result = new User($userdata['id'], $userdata['fiets'], $userdata['name']);
return $result;
}
// zoekfuncties
public find($query);
public findByName($name);
public findById($id);
public findByFiets($fiets);
//verwijder user per id
public remove($id);
// verwijder user per user object
public remove($user);
// sla nieuwe user op of update bestaande user
public save($user);
//etc
} |
Zo hou je de data (User class) en data access (database interactie classes) gescheiden. Als een User zichzelf moet kunnen beheren, is het einde nabij

.