[PHP] Cast d'objets

Résolu/Fermé
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 - 14 avril 2008 à 12:03
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 - 14 avril 2008 à 16:28
Bonjour,

Je voudrais savoir s'il existe un moyen facile de faire du type casting sur les objets ? (passé d'une classe à une classe dérivé). Je voudrais faire la même chose qu'en Java :
<?php

class maClasse {
}

class monAutreClasse extends maClass {
  function maFonction(){
  }
}

$objet = new MaClasse();

// Traitements

$autreObjet = (monAutreClasse)$objet;
?>

Actuellement, j'en suis réduit à utiliser une fonction personnelle qui fait un cast bourrin :
function castObject(&$obj, $class){
  $strlen = strlen($class);
  $class = strtolower($class);
  /* On transforme l'objet en une chaine de caractère */
  $serialize = serialize($obj);
  /* On modifie la chaine de caractère, en remplaçant la classe de l'objet par la nouvelle classe */
  $serialize = preg_replace('/^O:[0-9]+:"[^"]+":([0-9]+):{(.*)}$/', 'O:'.$strlen.':"'.$class.'":$1:{$2}', $serialize);
  /* On repasse la chaine de caractère en un objet */
  $obj = unserialize($serialize);
  
  /* On test si l'objet de fin correspond bien à l'objet voulut */
  if(is_object($obj) && strtolower(get_class($obj)) == $class){
    return true;
  } else {
    return false;
  }
}
A voir également:

7 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 avril 2008 à 15:11
Salut,

Tu te trompes de sens. C'est pas comme ça que ça se passe.
Imagine que tu as une classe médecin et une classe pédiatre qui hérite de médecin. Ca te semble logique de créer un médecin (donc généraliste) et de le mettre dans un cabinet de pédiatre? Non par contre l'inverse serait possible (même si dans la vie réelle en fait j'en suis pas certain :-D).

Donc l'orienté objet c'est plutôt l'inverse qui est logique. Un médecin n'est pas forcément pédiatre, par contre un pédiatre est médecin.
0
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 387
14 avril 2008 à 15:30
Oui, je me rappelle bien qu'il y a un passage qui est interdit. J'avais déjà du mal à le comprendre quand j'étais à l'IUT, et j'ai toujours du mal aujourd'hui. Pour moi, un pédiatre peu devenir véritablement un médecin si tu lui retire des connaissances, et le médecin peut devenir pédiatre si tu lui en ajoutes.
Mais bon, je vais pas me lancer la dedans, sinon je risque d'avoir le cerveau qui va griller

Ce qu'il me faut pour l'instant, c'est savoir si je suis obligé d'utiliser ma fonction, ou s'il existe déjà un moyen de le faire plus propre.
Après, je sais que ce que je vais en faire ne sera pas propres (comme dans mon exemple), mais j'y suis un peu obligé.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 avril 2008 à 15:37
Outch, oui c'est très bourrin ta manière de faire :-)
Wep c'est vraiment pas fait pour, là tu prends l'orienté objet à rebours.

Allez on va dire que t'as pas le choix :-)
Ce que tu peux faire c'est créer un constructeur dans ta classe dérivée qui prend en paramètre un objet de la classe mère. Et du coup tu crées une nouvelle instance par copie (en copiant les propriétés de la classe mère dans l'objet de la classe fille.)

Du coup tu passes pas par un cast (ce qui est contre-nature) mais tu crées une instance de la classe fille qui contient les attributs de la classe mère. Je ne sais pas si c'est ce que tu veux mais...
0
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 387
14 avril 2008 à 15:54
"Ce que tu peux faire c'est créer un constructeur dans ta classe dérivée qui prend en paramètre un objet de la classe mère. Et du coup tu crées une nouvelle instance par copie (en copiant les propriétés de la classe mère dans l'objet de la classe fille.)"

J'avais pensé à ça, mais j'aurais préféré ne pas avoir à faire cela.

Je vais essayer d'expliquer le problème :
J'ai actuellement une classe "Dossier", qui est initialisé à partir d'un identifiant unique. Toute mon application est fait ainsi. J'ai besoin de rajouter de nouvelle fonctionnalité (des type de Dossier qui ont des traitements particulier). J'ai donc pensé à faire des classe qui étendent la classe "Dossier", mais dont certaine fonctions ne font pas les même chose.
J'aurais donc voulu que lorsque je fais "new Dossier($id)", l'objet retourné ne soit pas forcément un "Dossier".
En mettant dans le constructeur "$this = castObject($this, 'DossierModife);' je pensais pouvoir faire cela.

La méthode n'est pas propre (je le reconnais), mais elle m'éviterait beaucoup de modification inutile.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 avril 2008 à 16:02
C'est au moment de la création de l'objet que tu devrais voir ça et non pas après. Une fois seulement que tu sais à quel dossier tu as affaire, tu lui crées l'instance appropriée.
0
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 387
14 avril 2008 à 16:05
L'inconvénient, c'est que je sait quel est le type de Dossier, seulement dans le constructeur de la classe Dossier. Le script n'a pas a gérer cela. C'est à la classe Dossier de faire cela.
L'autre solution qui me reste c'est de faire une fonction statique "Dossier::get($id)" qui me renvoie un objet selon le type du dossier. Les modifications que je devrait faire ne seront pas trop importante (normalement).
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 avril 2008 à 16:13
Exactement, c'est tout à fait comme ça qu'il faut faire. C'est un design pattern connu d'ailleurs, ça s'appelle une fabrique:
https://fr.wikipedia.org/wiki/Fabrique_%28patron_de_conception%29
0
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 387
14 avril 2008 à 16:28
Bon ben je vais faire une fabrique alors. Heureusement que l'application actuelle n'est pas très grosse, ca me fera pas trop de modification à faire.

Sinon, j'aurais quand même une fonction pour faire un Cast d'objet (même si la méthode est plus que bourrine).
0