$this se trompe de class

Résolu/Fermé
Stanislas Poisson Messages postés 424 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 22 mai 2018 - 26 déc. 2012 à 11:43
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - 1 janv. 2013 à 20:57
Bonjour a tous.

J'ai plusieurs class. on appelle un fonction de A qui doit formater un affiche suivant B

class A{
  public function Data(){
    return B::Date();
  }
}
$systA=new A();

class B{
  private $datetimezone;

  public SetTimeZone($a){
    $this->datetimezone=$a;
  }

  public Date(){
    return $this->datetimezone;
  }
}
$systB=new B();

$systB->SetTimeZone('Europe/Paris');
$systA->Data();


Le problème est le suivant:

Notice: Undefined property: A::$datetimezone in

donc, le $this de la class B se croit dans la class A.

Comment remédié a cela?

1 réponse

JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 1/01/2013 à 20:58
Salut !

En php, on définie une fonction avec le mot clé "function", ça m'étonne que PHP ne vous l'a pas signaler !

Quant au reste, en réalité vous vous trouver dans l'objet $systA, a travers cet objet vous avez appeler la méthode Date() dans un contexte statique, et dans cette méthode il y a th "$this", et "$this" pointe vers l'objet appelant, et non pas la classe appelante !

Donc il y a plusieurs façons d'y remédier !

1 - Héritage
<?php 
abstract class A{ 
 public function Data(){ 
  return $this->Date(); 
 } 
} 

class B extends A{ 
 private $datetimezone; 

 public function SetTimeZone($a){ 
  $this->datetimezone=$a; 
 } 

 public function Date(){ 
  return $this->datetimezone; 
 } 
} 

$systB = new B(); 
$systB->SetTimeZone('Europe/Paris'); 
echo $systB->Data(); 
?>


2 - Travailler dans un contexte statique (l'important c'est que $datetimezone soit statique)
<?php 
class A{ 
 public function Data(){ 
  return B::Date(); 

                /* Ou 
                $systB = new B(); 
  return $systB->Date(); 
                */ 
 } 
} 

class B { 
 private static $datetimezone; 

 public function SetTimeZone($a){ 
  self::$datetimezone = $a; 
 } 

 public function Date(){ 
  return self::$datetimezone; 
 } 
} 

B::SetTimeZone('Europe/Paris'); 

/* Ou 
$systB = new B(); 
$systB->SetTimeZone('Europe/Paris'); 
*/ 

$systA = new A(); 
echo $systA->Data(); 
?> 
0