Rechercher : dans
Par :

[PHP] Cast d'objets

Dernière réponse le 14 avr 2008 à 16:28:57 GallyNet, le 14 avr 2008 à 12:03:15 
 Signaler ce message aux modérateurs

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;
  }
}

Meilleures réponses pour « [PHP] Cast d'objets » dans :
PHP - Les variables Voir Concept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...
[PHP] Upload de fichiers VoirLe langage PHP permet de gérer des fichiers envoyés (uploadés) grâce à un formulaire HTML. Formulaire d'envoi de fichiers Configuration de PHP pour permettre l'upload Récupération du fichier avec PHP Formulaire d'envoi de fichiers La...
[PHP] Parse error, unexpected T_STRING, expecting ',' or ';' VoirCette erreur, fréquente, se produit notamment lorsqu'un guillemet est présent dans une chaîne délimitée par ce même type de guillemets, par exemple :
[PHP] Notice: Undefined index: VoirSi vous utilisez les tableaux $_POST ou $_GET pour récupérer les variables de vos formulaires ou autres, il se peut que vous tombiez sur cette erreur: Notice: Undefined index 'champs du tableau' in 'chemin du fichier php en cours d'execution' on line...
Télécharger PHP Edit VoirPHPEdit est un environnement de développement intégré (IDE) sous Windows pour le langage PHP. Il offre un grand nombre de fonctionnalités permettant de développer plus efficacement : Coloration syntaxique Auto-complétion des fonctions Débuggeur...
PHP - Les classes VoirLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la...
Javascript - L'objet String VoirLes particularités de l'objet String string est un mot anglais qui signifie "chaîne", il s'agit en fait de chaîne de caractères. L'objet String est un objet qui contient un certain nombre de propriétés et de méthodes permettant la manipulation...
Javascript - L'objet window VoirLes particularités de l'objet window L'objet window est l'objet par excellence dans Javascript, car il est le parent de chaque objet qui compose la page web, il contient donc : l'objet document: la page en elle-même l'objet location: le lieu de...

1

kilian, le 14 avr 2008 à 15:11:44

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.

Répondre à kilian

2

GallyNet, le 14 avr 2008 à 15:30:11

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é.

Répondre à GallyNet

3

kilian, le 14 avr 2008 à 15:37:43

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...

Répondre à kilian

4

GallyNet, le 14 avr 2008 à 15:54:29

"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.

Répondre à GallyNet

5

kilian, le 14 avr 2008 à 16:02:03

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.

Répondre à kilian

6

GallyNet, le 14 avr 2008 à 16:05:49

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).

Répondre à GallyNet

7

kilian, le 14 avr 2008 à 16:13:44

Exactement, c'est tout à fait comme ça qu'il faut faire. C'est un design pattern connu d'ailleurs, ça s'appelle une fabrique:
http://fr.wikipedia.org/wiki/Fabrique_%28patron_de_conceptio­n%29

Répondre à kilian

8

 GallyNet, le 14 avr 2008 à 16:28:57

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).

Répondre à GallyNet