IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Transtyper une instance


Sujet :

Langage PHP

  1. #1
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut [POO] Transtyper une instance
    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

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    non

    http://fr.php.net/manual/fr/language.types.type-juggling.php#language.types.typecasting

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    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

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    N'y a-t-il pas moyen de s'en sortir avec de l'héritage et un constructeur par copie ?

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    peut-on convertir facilement une instance d'une certaine classe en instance d'une autre classe ?
    Si tu trouves une bonne méthode je suis preneur mais je pense que pour le moment on vas serrer les fesses

    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 :

    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
    Enfin, typer un argument de fonction fonctionne avec les class et les interface.

    N'y a-t-il pas moyen de s'en sortir avec de l'héritage et un constructeur par copie ?
    cad ?

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    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.

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Si tu définis un constructeur par recopie dans ta classe,
    Tu veux dire un truc comme sa :

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

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par Séb.
    Bon j'espère que ça apparaîtra dans une future release, parce que c'est tout de même super-pratique.
    Pourquoi faire ?

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    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

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par siddh
    Je ne voit pas du tout comment tu peux vouloir faire un transtypage puisque tu ne défini pas de type de données.
    Je ne vois pas le rapport.

    Que veut tu faire exactement ?
    Qque chose dans ce style :

    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

  11. #11
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    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

  12. #12
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Citation Envoyé par siddh
    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 ?
    ça sert tout simplment à donner une vrai classe à tous les objets stdclass retourné par les fonction de php

    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $a = new ClassA();
     
    $b = new ClassB($a);
    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

  13. #13
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    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

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Citation Envoyé par ePoX
    Si tu définis un constructeur par recopie dans ta classe,
    Tu veux dire un truc comme sa :

    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);
    }
    ??
    C'était bien à cela que je pensais. J'ai encore un peu de mal à pondre du code objet à la volée...

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par siddh
    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
    +1

  16. #16
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Mr N.
    Citation Envoyé par siddh
    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
    +1
    C'est ce que j'ai fait finalement
    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

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par Séb.
    on se retrouve avec des constructeurs poubelles qui font de tout et de n'impote quoi.
    Par exemple ?

  18. #18
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Mr N.
    Citation Envoyé par Séb.
    on se retrouve avec des constructeurs poubelles qui font de tout et de n'impote quoi.
    Par exemple ?
    Regarde le code que j'ai donné au-dessus et sers toi de ton imagination...
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  19. #19
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    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.

  20. #20
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    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.
    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;
       }
    }
    si oui =>
    paramètres pas obligatoires, donc par défaut, donc NULL. Solution toujours viable.
    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
          }
       }
    }
    Je vois pas le problème.

Discussions similaires

  1. [POO] Accès à une instance objet depuis un enfant
    Par mokadjo dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 09/07/2011, 00h30
  2. [POO] supprimer une instance
    Par Sh4dow49 dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2008, 16h53
  3. [POO] Récupérer une instance de classe
    Par oranocha dans le forum Langage
    Réponses: 9
    Dernier message: 01/09/2008, 08h39
  4. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  5. [POO] Créer une instance d'un objet par la valeur d'une variable
    Par philworks dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/11/2007, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo