$this se trompe de class

Résolu
Stanislas Poisson Messages postés 775 Statut Membre -  
JooS Messages postés 2705 Statut Membre -
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

  1. JooS Messages postés 2705 Statut Membre 228
     
    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