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à ?!
Forum Programmation.php Bug dans la POO ?
21
juil.
2004
# Surprenant...
Posté par spongurex . É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 Pascal Terjan (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 fooVisiblement 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 spongurex . É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 Pascal Terjan (site web personnel) . Évalué à 2.
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 Julien Portalier . Évalué à 2.
D'ailleurs dans la doc. de PHP sur les classes, ils utilisent tout le temps = et non =& ... tsss...
# Curieux
Posté par Cali_Mero . Évalué à 2.
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 Pascal Terjan (site web personnel) . Évalué à 2.
[^] # Re: Curieux
Posté par Julien Portalier . Évalué à 2.
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.