Applicatie naamgeving
Code (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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
abstract class Model
{
// Eoa DB abstractie laag
protected static $_db;
// De 'static method factory'
// Een statische methode die een klasse opbouwt
// (in het specifiek de 'eigen' klasse, omdat getById
// aangeroepen wordt op de User klasse en het dan User object teruggeeft
public static function getById($id)
{
// Roep de DB abstractielaag aan
// Laat hem $this->table gebruiken, dat wordt ingevuld
// Door de specifieke klasse, en het argument als ID
$data = self::$_db->select($this->_table, $id);
// Maak zichzelf aan
// Het 'static' keyword verwijst naar de uiteindelijke (sub)klasse, bijv. User
// Het 'self' keyword verwijst naar deze klasse, dus Model
// En laat deze vullen door de constructor
return new static($data);
}
// Vul het object met de data uit de array
// Niet noodzakelijk voor mijn verhaal
// Misschien wel leuk om naar te kijken
public function __construct(array $data = array())
{
// Vraag alle properties op
$properties = get_object_vars($this);
// Vul alleen de properties zonder _ vooraan. Zo kan je een onderscheid maken tussen hulpvariabelen en 'echte' variabelen die in de DB kunnen staan
$properties = array_filter($properties, function($prop) {
return strpos($prop, '_') !== 0;
});
// Als de naam van de een property voorkomt in $data, vul dan
// De property met de gegeven waarde
foreach($properties as $key => $val)
{
if(isset($data[$key]))
$this->$key = $data[$key];
}
}
// Ter volledigheid
public function save()
{
self::$_db->save($this);
}
}
class User extends Model
{
protected $_table = 'users';
protected $name;
protected $password;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
//Gebruik:
$user = User::getById($id);
$user->getName();
$user->setName('Pim');
$user->save();
?>
abstract class Model
{
// Eoa DB abstractie laag
protected static $_db;
// De 'static method factory'
// Een statische methode die een klasse opbouwt
// (in het specifiek de 'eigen' klasse, omdat getById
// aangeroepen wordt op de User klasse en het dan User object teruggeeft
public static function getById($id)
{
// Roep de DB abstractielaag aan
// Laat hem $this->table gebruiken, dat wordt ingevuld
// Door de specifieke klasse, en het argument als ID
$data = self::$_db->select($this->_table, $id);
// Maak zichzelf aan
// Het 'static' keyword verwijst naar de uiteindelijke (sub)klasse, bijv. User
// Het 'self' keyword verwijst naar deze klasse, dus Model
// En laat deze vullen door de constructor
return new static($data);
}
// Vul het object met de data uit de array
// Niet noodzakelijk voor mijn verhaal
// Misschien wel leuk om naar te kijken
public function __construct(array $data = array())
{
// Vraag alle properties op
$properties = get_object_vars($this);
// Vul alleen de properties zonder _ vooraan. Zo kan je een onderscheid maken tussen hulpvariabelen en 'echte' variabelen die in de DB kunnen staan
$properties = array_filter($properties, function($prop) {
return strpos($prop, '_') !== 0;
});
// Als de naam van de een property voorkomt in $data, vul dan
// De property met de gegeven waarde
foreach($properties as $key => $val)
{
if(isset($data[$key]))
$this->$key = $data[$key];
}
}
// Ter volledigheid
public function save()
{
self::$_db->save($this);
}
}
class User extends Model
{
protected $_table = 'users';
protected $name;
protected $password;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
//Gebruik:
$user = User::getById($id);
$user->getName();
$user->setName('Pim');
$user->save();
?>
Toevoeging op 20/12/2011 14:45:15:
Is het een beetje duidelijk?
Gewijzigd op 20/12/2011 14:45:41 door Pim -
Dankjewel!
Zou je die class Model in de praktijk ook zo noemen? Of noem je het dan anders?
Toevoeging op 20/12/2011 16:24:48:
Leuk bruggetje naar de topic titel trouwens :-P
Ah oké, thanks Pim!
Pim, bedankt voor al die nuttige informatie, links en code die je telkens weer geeft! Het is echt een groot voorbeeld van hoe OOP eruit ziet en ik heb er veel aan!
Ik moet toch iets verzinnen om de tentamenvoorbereiding nog wat uit te kunnen stellen :-P