Bonjour !
Je cherche un moyen de transtyper une instance de classe A en classe B. Existe-t-il un moyen de faire cela avec PHP4 ? Ou PHP5 ? J'ai bien peur que non mais sait-on jamais.
Merci![]()
Bonjour !
Je cherche un moyen de transtyper une instance de classe A en classe B. Existe-t-il un moyen de faire cela avec PHP4 ? Ou PHP5 ? J'ai bien peur que non mais sait-on jamais.
Merci![]()
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
non
http://fr.php.net/manual/fr/language.types.type-juggling.php#language.types.typecasting
Argh![]()
Mais sans faire un transtypage pur style (nouveauType), peut-on convertir facilement une instance d'une certaine classe en instance d'une autre classe ?
Bon j'espère que ça apparaîtra dans une future release, parce que c'est tout de même super-pratique.
En tout cas merci bien ePox.
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Salut
N'y a-t-il pas moyen de s'en sortir avec de l'héritage et un constructeur par copie ?
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework - Cours et tutoriels pour apprendre PHP - Forum PHP
Si tu trouves une bonne méthode je suis preneur mais je pense que pour le moment on vas serrer les fessespeut-on convertir facilement une instance d'une certaine classe en instance d'une autre classe ?
Les seuls typage que j'ai pu réaliser, c'est des upcast (typer une instance vers une classe de base) lors du passage en parametre à une fonction.
Pour les downcast sa ne fonctionne pas.
Mais bon ce n'est pas moi qui le gère c'est PHP.
En bref voila quelques test :
Enfin, typer un argument de fonction fonctionne avec les class et les interface.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class A{} class B extends A{} class C extends A{} $A = new A(); $C = new C(); $B = new B(); // On vas tenter de remonter dans la hierarchie function upcast( A $obj ) { var_dump($obj); echo "<br>"; } // On vas tenter de redescendre dans la hierarchie function downcast( C $obj ) { var_dump($obj); echo "<br>"; } upcast( $C ); upcast( $B ); upcast( $A ); downcast( $C ); downcast( $B );//Fatal error: Argument 1 passed to downcast() must be an instance of C downcast( $A );//Fatal error: Argument 1 passed to downcast() must be an instance of C
cad ?N'y a-t-il pas moyen de s'en sortir avec de l'héritage et un constructeur par copie ?
Tu as donné un exemple de ce à quoi je pensais : l'upcasting.
Si tu définis un constructeur par recopie dans ta classe, tu peux +/- utiliser l'upcasting pour +/- transtyper ton objet.
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework - Cours et tutoriels pour apprendre PHP - Forum PHP
Tu veux dire un truc comme sa :Si tu définis un constructeur par recopie dans ta classe,
??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class A{} class B extends A{} class C extends A { public function static getInstanceFromA(A object); }
Pourquoi faire ?Envoyé par Séb.
le transtypage ne sert que dans les langages comme java avec un typage fort.
Je ne voit pas du tout comment tu peux vouloir faire un transtypage puisque tu ne défini pas de type de données.
Le transtypage sert quand tu manipule un objet au travers d'une référence à une de ses classe parente (manipuler une voiture comme un vehicule).
Vu qu'on ne peut pas faire ça en php, le trantypage n'a pas lieu d'être.
Que veut tu faire exactement ?
Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.
Cours | FAQ | Sources Javascript
Cours | FAQ | Sources PHP
Mes Articles
Je ne vois pas le rapport.Envoyé par siddh
Qque chose dans ce style :Que veut tu faire exactement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php class Person { var $id ; var $name ; // Statique function createWith($tuple) { $person = new Person( ) ; $person->id = $tuple->person_id ; $person->name = $tuple->person_name ; return $person ; } } class Actor extends Person { var $role ; // Statique function createWith($tuple) { $actor = (Actor)Person::createWith($tuple) ; $actor->role = $tuple->actor_role ; return $actor ; } } $tuple = (object)array( 'person_id' => 123, 'person_name' => 'Louis De Funes', 'actor_role' => 'Don Saluste') ; $actor = Actor::createWith($tuple) ; ?>
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
pourquoi ne pas utiliser le constructeur tout simplement ?
Ok tu pourras pas le faire en statique mais en appelant le constructeur qui lui meme appelera celui du parent tu fera ce que tu veux
Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.
Cours | FAQ | Sources Javascript
Cours | FAQ | Sources PHP
Mes Articles
ça sert tout simplment à donner une vrai classe à tous les objets stdclass retourné par les fonction de phpEnvoyé par siddh
par exeple après un "SELECT user.* FROM user;"
si tu fait un pg_fetch_object tu obtient un stdclass object
c'est tout de même plus cool de récupérer un objet de la classe "Utilisateur"
le constructeur par recopie c'est bien mais ça RECOPIE un transtypage modifie l'instance elle même.
si le constructeur de B est un constructeur par recopie $b est bien une instance "transtypée" de A vers B mais $a est toujours un A
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $a = new ClassA(); $b = new ClassB($a);
ok mais tu ne pourras transtyper ton std_class en utilisateur que si utilisateur dérive de ton std_class non ?
Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.
Cours | FAQ | Sources Javascript
Cours | FAQ | Sources PHP
Mes Articles
C'était bien à cela que je pensais. J'ai encore un peu de mal à pondre du code objet à la volée...Envoyé par ePoX
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework - Cours et tutoriels pour apprendre PHP - Forum PHP
+1Envoyé par siddh
C'est ce que j'ai fait finalementEnvoyé par Mr N.
Mais vu que PHP ne supporte pas (encore) la surcharge de méthodes j'aurais préféré éviter cela, parce qu'au final on se retrouve avec des constructeurs poubelles qui font de tout et de n'impote quoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php class Person { var $id ; var $name ; function Person($tuple = NULL) { if ( $tuple !== NULL ) { $this->id = $tuple->person_id ; $this->name = $tuple->person_name ; } } } class Actor extends Person { var $role ; function Actor($tuple = NULL) { if ( $tuple !== NULL ) { parent::Person($tuple) ; $this->role = $tuple->actor_role ; } } } $tuple = (object)array( 'person_id' => 123, 'person_name' => 'Louis De Funes', 'actor_role' => 'Don Saluste') ; $actor = new Actor($tuple) ; ?>
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Par exemple ?Envoyé par Séb.
Regarde le code que j'ai donné au-dessus et sers toi de ton imagination...Envoyé par Mr N.
![]()
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
ben je suppose que Seb. voulait dire qu'on doit utiliser le constructeur pour faire ca ET pour construire un "vrai" objet a partir de rien.
Typiquement, soit creer un nouvel objet, soit le récuperer depuis une base de donnée. Ca oblige a avoir des parametres optionnels comme $tuple=NULL dans les constructeurs.
Ben une personne sans id et sans nom c'est possible ?
si non =>
obligé de passer des paramètres pour la création, donc la solution proposée ci-dessus est viable que ce soit from scratch ou from db. Le fait que le parametre soit null par defaut (et donc le if associé) n'est néanmoins pas très pertinent.
si oui =>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Foo { function Foo($params) { $this->bar = $params->bar; } }
paramètres pas obligatoires, donc par défaut, donc NULL. Solution toujours viable.
Je vois pas le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class Foo { function Foo($params = NULL) { if ($params) { $this->bar = $params->bar; } else { $this->bar = NULL; //ou '' ou autre valeur par defaut } } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager