$this se trompe de class
Résolu
Stanislas Poisson
Messages postés
775
Statut
Membre
-
JooS Messages postés 2705 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
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?
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
-
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(); ?>