Forum Programmation.php Bug dans la POO ?

Posté par  .
Étiquettes : aucune
0
21
juil.
2004
Je viens de tomber sur un bug étrange dans PHP4, et je me questionne. Celui-ci se trouve dans la Programmation Orientée Objet (POO).

J'ai tout simplement deux classes : BiduleNews et BiduleStructuredText. Je crée un objet « $news = new BiduleNews; ». Une fonction de BiduleNews appelle directement une fonction de BiduleStructuredText, comme ça : « $body = BiduleStructuredtext::XHTML( $_POST['body'] ); ».

Jusque là, aucun problème du tout. Sauf que normalement dans la fonction BiduleStructuredText::XHTML() ainsi appelée, je ne dois pas avoir de $this, ce qui est fort normal. D'ailleurs lorsque j'appelle cette fonction directement hors d'une classe, $this n'existe pas. Seulement dans mon cas sus expliqué : ce n'est pas le cas ! Et oui, je me retrouve avec un $this dans BiduleStructuredText::XHTML() ! Un petit coup de « echo get_class( $this ); » m'affiche « BiduleNews » ...

Ainsi $this se passe d'une instance à une autre qui 1- n'a strictement rien à voir ; et 2- qui ne devrait pas en avoir ! Y'aurait pas comme un bug là ?!
  • # Surprenant...

    Posté par  . Évalué à 2.

    Effectivement, ce comportement à l'air bizarre.
    
    Sans le code, la première idée qui me vient à l'esprit : Y aurait il un lien quelconque entre les deux classes ?
    
    Du style héritage ou aggregation ?
    
    Parce que je code en PHP quelque chose du même style :
    
    class Page
    {
       function ma_fonction()
       {
          echo Langage::get();
       }
    }
    
    Et la variable $this dans la classe Langage n'est absolument pas utilisable.
    • [^] # Re: Surprenant...

      Posté par  (site web personnel) . Évalué à 2.

      <?php
              class Plop {
                      function coin(){
                              echo get_class($this);
                      }
              }
              class Foo {
                      function plop(){
                              Plop::coin();
                      }
              }
              $foo =& new Foo();
              $foo->plop();
      ?>
      
      $ php oo.php
      foo
      
      Visiblement il prend le $this de la classe ou se fait l'appel (genre $this est une variable locale et comme là elle est pas définie il prend celle d'au dessus...)
      • [^] # Re: Surprenant...

        Posté par  . Évalué à 2.

        <?php
           error_reporting(E_ALL);
        
           class Langage
           {
              function get()
              {
                 echo get_class($this);
              }
           }
        
           class Page
           {
              function affiche()
              {
                 Langage::get();
              }
           }
        
           Page::affiche();
        
        ?>
        =====================================
        
        Dans mon cas, $this n'est pas transmis puisque même l'objet appelant n'existe pas.
        Mais le bug que tu signale existe bien. Il faut maintenant voir si le comportement est voulu ou pas.
  • # Juste une remarque avant de regarder le pb

    Posté par  (site web personnel) . Évalué à 2.

    $news = new BiduleNews;

    la tu crées 2 objets, = faisant une recopie en PHP4. Met plutôt =&
    • [^] # Re: Juste une remarque avant de regarder le pb

      Posté par  . Évalué à 2.

      Oh merci, c'est le genre de petites choses que je ne maîtrise pas encore très bien en PHP. Si jamais il existe une petite page web récapitulant quelques petits trucs pratique de ce genre, je suis preneur ^^

      D'ailleurs dans la doc. de PHP sur les classes, ils utilisent tout le temps = et non =& ... tsss...
  • # Curieux

    Posté par  . Évalué à 2.

    Ca m'a tout l'air d'un bug... J'avais entendu dire qu'on pouvait écraser $this pour écraser dynamiquement l'objet en cours, mais jamais encore que $this pouvait se propager implicitement d'un objet à une méthode de classe...

    Il serait intéressant de vérifier si le fonctionnement est identique sous php5, le modèle objet y ayant été complètement refait.

    En tout cas, ouvrir un ticket sur le bugzilla serait, je pense, une bonne idée.
    • [^] # Re: Curieux

      Posté par  (site web personnel) . Évalué à 2.

      • [^] # Re: Curieux

        Posté par  . Évalué à 2.

        Et bien ce n'est pas un bug ! C'est le comportement voulu dans PHP 4 et la compatibilité est restée en PHP 5... Sauf qu'en PHP 5 on peut déclarer Foo::plop(); comme étant static et donc n'ayant pas de $this, mais ce n'est pas forcément des plus pratiques.

        N'empêche, c'est bizarre cette fonctionnalité... et je n'arrive pas à trouver d'infos dans la doc. sur cette façon de faire...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.