Object uit database
Ik zit momenteel met een klein complex dingetje, waar ik niet geheel uitkom.
(alle komende namen zijn verzinsel om het gewoon duidelijk te maken).
Ik heb een adminstratie paneel, waarin je beestjes kan aanmaken.
Deze beestjes propt hij dan in de database.
Maar deze beestjes zijn ook een object.
ze erven allemaal van het object beestjes.
Nu heb ik bijvoorbeeld 5 type beestjes
-LoopBeestje
-VliegBeestje
-ZwemBeestje
-AmfibischBeestje (zwemt en loopt)
-ImfobischBeestje (zwemt en vliegt)
Nu wil ik dus, dat vanuit mijn database het juiste object woord aangemaakt, maar hoe kan ik dit nu het beste doen?
Moet ik bij aanmaak de objecten serializen (geeft een leraar als optie) of deze gewoon opslaan, met een type id, en aan de hand daarvan het object aanmaken?
Heeft iemand een slim idee, of een nog genialer ingeving?
1. Voor ieder type een eigen tabel en eventueel de nodige tabellen voor abstracte typen (ik kan me voorstellen dat jij een abstacte klasse 'beestje' hebt.) Dit is het makkelijkste te herkennen in de database maar lastiger te implementeren omdat deze verschillende tabellen maar 1 'gedeeltede' primary key mogen hebben, of te wel, alle andere primary key's zijn meteen ook foreign key's naar de primary key van de basis tabel. Je hebt dus transacties nodig om te zorgen dat je database klopt.
2. Een tabel met voor iedere eigenschap van alle beestjes een kolom. Je zou nu het type moeten kunnen herkennen, een 'vliegbeestje' is bijvoorbeeld de enige die geen NULL in de kolom 'vleugels' heeft staan. Om de typen wat duidelijker aan te duiden kan je ook een kolom toevoegen die het type aanduid, maar dat is niet perse nodig.
Edit Zie net dat mijn voorbeeld met vleugels niet helemaal opgaat, maar het gaat om het idee, ik hoop dat het duidelijk is.
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Ik heb net even lopen testen, en het werkt echt heel mooi, vind ik zelf.
ik heb de volgende code uitgevoerd,
(ik weet, lelijk en onoverzichtelijk, maar het is alleen voor het testen)
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
80
81
82
83
84
85
86
87
88
89
90
91
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
80
81
82
83
84
85
86
87
88
89
90
91
<?php
class animall {
private $name;
private $age;
public $owner;
public $sound;
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
}
function getage() {
return ($this->age * 365);
}
function getowner() {
return ($this->owner);
}
function getname() {
return ($this->name);
}
}
class dog extends animall
{
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
$this->sound = "Bark!";
}
}
class cat extends animall
{
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
$this->sound = "Miaouw!";
}
}
/**
* The Animall
*/
$animall = new animall("Rover",12,"Lisa and Graham");
$petS = serialize($animall);
$pet = unserialize($petS);
echo '<h1>The Animall</h1>';
echo 'Real Object:<br />';
print_r($animall);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
/**
* The Dog
*/
$dog = new dog("Rover",12,"Lisa and Graham");
$petS = serialize($dog);
$pet = unserialize($petS);
echo '<h1>The Dog</h1>';
echo 'Real Object:<br />';
print_r($dog);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
/**
* The Cat
*/
$cat = new cat("Rover",12,"Lisa and Graham");
$petS = serialize($cat);
$pet = unserialize($petS);
echo '<h1>The Cat</h1>';
echo 'Real Object:<br />';
print_r($cat);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
?>
class animall {
private $name;
private $age;
public $owner;
public $sound;
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
}
function getage() {
return ($this->age * 365);
}
function getowner() {
return ($this->owner);
}
function getname() {
return ($this->name);
}
}
class dog extends animall
{
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
$this->sound = "Bark!";
}
}
class cat extends animall
{
function __construct($in_name="unnamed",$in_age="0",$in_owner="unknown") {
$this->name = $in_name;
$this->age = $in_age;
$this->owner = $in_owner;
$this->sound = "Miaouw!";
}
}
/**
* The Animall
*/
$animall = new animall("Rover",12,"Lisa and Graham");
$petS = serialize($animall);
$pet = unserialize($petS);
echo '<h1>The Animall</h1>';
echo 'Real Object:<br />';
print_r($animall);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
/**
* The Dog
*/
$dog = new dog("Rover",12,"Lisa and Graham");
$petS = serialize($dog);
$pet = unserialize($petS);
echo '<h1>The Dog</h1>';
echo 'Real Object:<br />';
print_r($dog);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
/**
* The Cat
*/
$cat = new cat("Rover",12,"Lisa and Graham");
$petS = serialize($cat);
$pet = unserialize($petS);
echo '<h1>The Cat</h1>';
echo 'Real Object:<br />';
print_r($cat);
echo '<br /><br />Serialized Object:<br />';
print $petS;
echo '<br /><br />Unserialize Object:<br />';
print_r($pet);
?>
en dan is dit het resultaat:
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
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
The Animall
Real Object:
animall Object ( [name:private] => Rover [age:private] => 12 [owner] => Lisa and Graham [sound] => )
Serialized Object:
O:7:"animall":4:{s:13:"�animall�name";s:5:"Rover";s:12:"�animall�age";i:12;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";N;}
Unserialize Object:
animall Object ( [name:private] => Rover [age:private] => 12 [owner] => Lisa and Graham [sound] => )
The Dog
Real Object:
dog Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Bark! [name] => Rover [age] => 12 )
Serialized Object:
O:3:"dog":6:{s:13:"�animall�name";N;s:12:"�animall�age";N;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";s:5:"Bark!";s:4:"name";s:5:"Rover";s:3:"age";i:12;}
Unserialize Object:
dog Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Bark! [name] => Rover [age] => 12 )
The Cat
Real Object:
cat Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Miaouw! [name] => Rover [age] => 12 )
Serialized Object:
O:3:"cat":6:{s:13:"�animall�name";N;s:12:"�animall�age";N;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";s:7:"Miaouw!";s:4:"name";s:5:"Rover";s:3:"age";i:12;}
Unserialize Object:
cat Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Miaouw! [name] => Rover [age] => 12 )
Real Object:
animall Object ( [name:private] => Rover [age:private] => 12 [owner] => Lisa and Graham [sound] => )
Serialized Object:
O:7:"animall":4:{s:13:"�animall�name";s:5:"Rover";s:12:"�animall�age";i:12;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";N;}
Unserialize Object:
animall Object ( [name:private] => Rover [age:private] => 12 [owner] => Lisa and Graham [sound] => )
The Dog
Real Object:
dog Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Bark! [name] => Rover [age] => 12 )
Serialized Object:
O:3:"dog":6:{s:13:"�animall�name";N;s:12:"�animall�age";N;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";s:5:"Bark!";s:4:"name";s:5:"Rover";s:3:"age";i:12;}
Unserialize Object:
dog Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Bark! [name] => Rover [age] => 12 )
The Cat
Real Object:
cat Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Miaouw! [name] => Rover [age] => 12 )
Serialized Object:
O:3:"cat":6:{s:13:"�animall�name";N;s:12:"�animall�age";N;s:5:"owner";s:15:"Lisa and Graham";s:5:"sound";s:7:"Miaouw!";s:4:"name";s:5:"Rover";s:3:"age";i:12;}
Unserialize Object:
cat Object ( [name:private] => [age:private] => [owner] => Lisa and Graham [sound] => Miaouw! [name] => Rover [age] => 12 )
Ordeel zelf maar, volgens mij werkt dit veel makkelijker en sneller
Enige nadeel is dat je de class-definities niet te veel meer kan veranderen wanneer ze eenmaal in de database zitten, en dat je de database niet kan laten zoeken of sorteren op de eigenschappen van het object.
Opzich moet het ook niet al te veel uitmaken, omdat dit alleen voor die beestjes (of in mijn geval monsters) gebruikt gaat worden.
En ik kan altijd nog alle gegevens in een database gooien, en dan een extra veld dat object heet o.i.d., dan kan ik wel gewoon sorteren op iets, en dan selecteer ik alleen het object.
Dan moet ik alleen een (slimme) functie maken die ontbrekende gegevens bijwerkt.
Ik zie nu dat als het object niet compleet is, dat hij dan een catchable fatal error geeft.
Ik ga eens even kijken of ik iets werkends krijg,