par
titerm » 17 sept. 2007, 12:21
Tout dépend du contexte évidement, mais si jamais l'objet stocké évolu (que ce soit en milieu de projet ou 3 ans après parce qu'on a toujours de nouveaux besoins) ça devient une véritable galère à remettre à jour dans la base...
@ryle: Dans mon cas, le fait que la donnée soit sérialise donne beaucoup de souplesse et évite d'avoir a faire des MAJ BDD. Mais je n'ai peut être pas éte assez précis dans ma façon de faire. Je n'exploite pas directement l'objet désérialise mais je passe par une méthode de l'objet qui reconstruit elle même l'objet. Je travail donc toujours avec la dernière version de l'objet même si j'ai des propriétés qui ne sont pas renseigné, ce sont les accesseur qui géreront le défaut.
class objLien {
public $href;
public $label;
public $target;
public function get() {return serialize($this);}
public function set($v) {
$tmp = @unserialize($v);
$list = array_keys(get_object_vars($this));
foreach($list as $attr) {
$this->$attr = empty($tmp->$attr) ? null : $tmp->$attr;
}
}
public function __set($attr, $value) {$this->$attr = $value;}
}
class objLien2 {
public $href;
public $label;
public $target;
public $accessKey;
public function get() {return serialize($this);}
public function set($v) {
$tmp = @unserialize($v);
$list = array_keys(get_object_vars($this));
foreach($list as $attr) {
$this->$attr = empty($tmp->$attr) ? null : $tmp->$attr;
}
}
public function __set($attr, $value) {$this->$attr = $value;}
}
$foo = new objLien();
$foo->href = 'http://www.google.com';
$foo->label = 'Google';
$foo->target = '__parent';
$r = $foo->get();
$foo2 = new objLien2();
$foo2->set($r);
var_dump($foo2);
Imagine que tu gères un objet lien (avec url, label, target, les events etc...). Tu stocks la version serialisé dans la base. ObjLien
Plus tard, tu veux ajouter la navigation clavier et donc ajouter l'attribut ACCESSKEY. Tu met a jours l'object (ObjLien2). A partir de maintenant, tu peux gérer cette propriété. Soit elle n'est pas renseigné dans les ancien objets auquel cas, c'est le webmaster qui devra la renseigner, soit elle l'est et tu peux la traiter.
Plus tard encore, tu passes au HTML strict. Donc l'attribut target devient interdit. Tu peux le supprimer de la classe ou simplement l'ignorer dans les méthodes de la class, dans le toHTML() par exemple, ne en faire plus le rendu.
C'est juste un exemple simplifié pour donner une idée.
[quote]Tout dépend du contexte évidement, mais si jamais l'objet stocké évolu (que ce soit en milieu de projet ou 3 ans après parce qu'on a toujours de nouveaux besoins) ça devient une véritable galère à remettre à jour dans la base... [/quote]
@ryle: Dans mon cas, le fait que la donnée soit sérialise donne beaucoup de souplesse et évite d'avoir a faire des MAJ BDD. Mais je n'ai peut être pas éte assez précis dans ma façon de faire. Je n'exploite pas directement l'objet désérialise mais je passe par une méthode de l'objet qui reconstruit elle même l'objet. Je travail donc toujours avec la dernière version de l'objet même si j'ai des propriétés qui ne sont pas renseigné, ce sont les accesseur qui géreront le défaut.
[php]
class objLien {
public $href;
public $label;
public $target;
public function get() {return serialize($this);}
public function set($v) {
$tmp = @unserialize($v);
$list = array_keys(get_object_vars($this));
foreach($list as $attr) {
$this->$attr = empty($tmp->$attr) ? null : $tmp->$attr;
}
}
public function __set($attr, $value) {$this->$attr = $value;}
}
class objLien2 {
public $href;
public $label;
public $target;
public $accessKey;
public function get() {return serialize($this);}
public function set($v) {
$tmp = @unserialize($v);
$list = array_keys(get_object_vars($this));
foreach($list as $attr) {
$this->$attr = empty($tmp->$attr) ? null : $tmp->$attr;
}
}
public function __set($attr, $value) {$this->$attr = $value;}
}
$foo = new objLien();
$foo->href = 'http://www.google.com';
$foo->label = 'Google';
$foo->target = '__parent';
$r = $foo->get();
$foo2 = new objLien2();
$foo2->set($r);
var_dump($foo2);
[/php]
Imagine que tu gères un objet lien (avec url, label, target, les events etc...). Tu stocks la version serialisé dans la base. ObjLien
Plus tard, tu veux ajouter la navigation clavier et donc ajouter l'attribut ACCESSKEY. Tu met a jours l'object (ObjLien2). A partir de maintenant, tu peux gérer cette propriété. Soit elle n'est pas renseigné dans les ancien objets auquel cas, c'est le webmaster qui devra la renseigner, soit elle l'est et tu peux la traiter.
Plus tard encore, tu passes au HTML strict. Donc l'attribut target devient interdit. Tu peux le supprimer de la classe ou simplement l'ignorer dans les méthodes de la class, dans le toHTML() par exemple, ne en faire plus le rendu.
C'est juste un exemple simplifié pour donner une idée.