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] Cast d'objet vers une classe


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut [POO] Cast d'objet vers une classe
    Bonjour à tous,

    est-il possible de caster un objet en un autre objet ?

    Ici : http://us3.php.net/manual/en/languag...object.casting il est expliqué qu'on peut caster avec la syntaxe (object) en un stdClass.

    Je voudrais caster un objet dans une classe bien spécifique (pas stdClass).
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $a = (myClass) $objetduneautreclasse;
    Ce qui génère une parse error.

    Merci,

    Karl3i.

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    heuuu (myClass) n'existe pas

    la synthaxe (object) est la même que d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $var = "blabla";
     
    $a = (int) $var; // $a = 0
    $b = (array) $var; // $b = array('blabla')
    ?>
    c'est un mot clé et non une variable... est-ce que je me trompe ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Si mes souvenirs sont bons, PHP ne permet pas de caster d'une classe vers une autre. Tu dois te faire la copie des données à la main.

    Il existe une astuce pour tricher et caster en sérialisant la classe mais j'en dirai pas plus tellement la méthode est dégueulasse et périlleuse

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Merci pour vos réponses.

    @ darkstar123456 : oui, "myClass", c'était pour l'exemple. (object) est bien un mot clé, mais justement l'objet (^^) de ma question, c'était est-ce qu'il y a moyen de faire un cast.

    @ Petibidon :
    J'ai vu l'astuce en effet au cours de mes recherches avec serialize, traitement de la chaîne et unserialize, mais elle est plutôt chaotique en effet .

    La copie des données à la main, c'est précisément ce que j'ai développé (en utilisant foreach sur l'objet, grâce à iterator sur objet)... et je cherchais une solution plus immédiate.
    Il apparaît donc que ce n'est pas possible en PHP, on verra à la version 6 peut-être ?

  5. #5
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    ha désolé j'avais mal compris ta question...

    Sinon perso, ceci fonctionne très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $smarty = new Smarty;
    $test = (object) $smarty;

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tu pourrais aussi tout simplement faire en sorte que ta classe implémente l'interface souhaitée dans le cast. Ce serait moins crade...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    @darkstar

    Sauf erreur de ma part, ton cast ne fait rien dans le code que tu as donné. Tu castes un objet en objet...

    Exemple :

    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
     
    class Abc {
      public $toto;
      public $tutu;
    }
     
     
    $abc = new Abc;
     
    echo "<pre>";
    print_r($abc);
    echo "</pre>";
     
    $b = (object) $abc;
    echo "<pre>";
    print_r($b);
    echo "</pre>";
    @snafu, je ne vois pas ce que tu veux dire... le cast n'est de toute façon pas possible au niveau de la syntaxe PHP, à part, celui, limité, en (object), mais sans pouvoir spécifier le nom réel de l'objet.
    Après, que des classes implémentent la même interface, soit, mais même pas besoin de cast pour appeler des méthodes définies au niveau de l'interface.

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par karl3i Voir le message
    Après, que des classes implémentent la même interface, soit, mais même pas besoin de cast pour appeler des méthodes définies au niveau de l'interface.
    Ben... justement.

    Plus besoin de cast.

    Pour y voir plus clair : pourquoi as-tu besoin de caster ton objet ?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    salut,

    c'est pas possible de downcaster ton objet.

    :/

    a plus

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    @snafu : ma question porte sur le fait si c'est possible de faire un cast en PHP (et en fait, on a vu qu'il y a un cast possible, très limité, avec object). Tu me donnes une méthode (que je connais) pour éviter le cast, ça ne répond pas à la question.

    Sinon, pour expliciter la méthode chaotique évoquée par Petibidon, voici un exemple :

    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
    class Abc {
      public $toto;
      public $tutu;
    }
     
    $a = new stdClass();
    $a->toto = "hello!";
    $a->tutu = "tutu!";
     
    print_r($a);
     
    $serialized = serialize($a);
     
    echo ($serialized);
     
    $new = str_replace("O:8:\"stdClass\"","O:3:\"Abc\"",$serialized);
     
    echo "<br>\n";
    echo ($new);
    echo "<br>\n";
     
    echo "<pre>";
    print_r(unserialize($new));
    echo "</pre>";
    Attention, à utiliser pour s'amuser, mais pas en prod .

Discussions similaires

  1. [POO] Un objet dans une classe
    Par Arnich dans le forum Langage
    Réponses: 6
    Dernier message: 25/11/2007, 23h46
  2. [POO] création d'objet via une fabrique de classe
    Par flash_math dans le forum Langage
    Réponses: 2
    Dernier message: 10/11/2007, 10h15
  3. [POO] import d'objet dans une classe
    Par wdionysos dans le forum Langage
    Réponses: 3
    Dernier message: 01/04/2006, 22h05
  4. Réponses: 19
    Dernier message: 03/02/2006, 00h30

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