|
|
|
|
<?php
class maClasse {
}
class monAutreClasse extends maClass {
function maFonction(){
}
}
$objet = new MaClasse();
// Traitements
$autreObjet = (monAutreClasse)$objet;
?>
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;
}
}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. |
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é. |
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... |
"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. |
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. |
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).
|
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). |
| 27/03 16h03 | [PHP] Méthodes de débogage | PHP |
| 03/11 14h19 | [PHP] Détecter la résolution d'affichage | PHP |
| 17/04 20h50 | Page, doc et tutoriaux officiels | PHP |
| 20/04 18h59 | [PHP] Fonction mail() | PHP |
| 21/04 11h38 | Liens utiles | PHP |
| 23/07 02h01 | Recherche développeur php orienté objet | 1 |
| 17/06 16h12 | Mail PHP avec objet à caractères accentués | 4 |
| 25/05 10h07 | [Dreamweaver/Rapid PHP] positionnement objet | 1 |
| 10/04 03h21 | PHP Objet et Jeu en ligne | 2 |
![]() | PHP Edit - PHPEdit est un environnement de développement intégré (IDE) sous Windows pour le langage PHP. Il offre un grand nombre de... | Catégorie: PHP Licence: Freeware/gratuit |
![]() | WAMP Server - WAMP5 (WAMP signifiant Windows Apache Mysql PHP) est une plateforme de développement Web sous Windows. Il vous permet de... | Catégorie: Serveurs Licence: Freeware/gratuit |
![]() | easyPHP - EasyPHP est un environnement de travail packagé comprenant le serveur web Apache, le système de gestion de bases de données... | Catégorie: Serveurs Licence: Open Source |
![]() | PSPad - PSPad est un excellent éditeur de texte. Il est utile pour travailler sur du simple texte, mais aussi sur du HTML, CSS,... | Catégorie: Développement Licence: Freeware/gratuit |
![]() | The Sims 2: Castaway | Catégorie: Jeu vidéo PS2 | 14.00 € Dimipro |
![]() | Return to Castle Wolfenstein | Catégorie: Jeu vidéo Xbox | 9.00 € Micromania |
![]() | The Sims 2: Castaway | Catégorie: Jeu vidéo PSP | 17.99 € PriceMinister |
![]() | Castlevania: Dracula X Chronicles | Catégorie: Jeu vidéo PSP | 39.99 € Alapage |